C++的XML编程经验――LIBXML2库使用指南
C的xml编程-libxml2

C的xml编程-libxml2C的xml编程-libxml2 这里主要讲述libxml2在linux 下的使用。
(以下内容除了linux下的安装步骤是自己写的,其余均出自/wxb_nudt/archive/2007/11/28/161340. html,由于该篇文章讲解的非常详细,我也没必要重写一遍了。
如果该篇文章早出些时候,早期开发我也不会走很多弯路了。
虽然在该篇文章出现之前我已经对libxml2较熟悉了并开发完毕,但为了备忘,现在将该篇文章作为收藏之用。
在此再次感谢这篇文章的大侠为大家整理了这篇文章^_^)1. 下载与安装LIBXML2Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。
Libxml2的下载地址是/,完全版的库是开源的,并且带有例子程序和说明文档。
最好将这个库先下载下来,因为这样可以查看其中的文档和例子。
由于我是在linux下用C语言进行开发的,所以我下载的是libxml2-2.6.20.tar.gz版本的源码包。
具体安装步骤:1、解压:$tar zxvf libxml2-2.6.20.tar.gz2、进入解压后的安装目录:$cd libxml2-2.6.203、安装三部曲:1)$./configure2)$make3)$make install安装完毕。
2. Libxml2中的数据类型和函数一个函数库中可能有几百种数据类型以及几千个函数,但是记住大师的话,90%的功能都是由30%的内容提供的。
对于libxml2,我认为搞懂以下的数据类型和函数就足够了。
2.1 内部字符类型xmlCharxmlChar是Libxml2中的字符类型,库中所有字符、字符串都是基于这个数据类型。
事实上它的定义是:xmlstring.htypedef unsigned char xmlChar;使用unsigned char作为内部字符格式是考虑到它能很好适应UTF-8编码,而UTF-8编码正是libxml2的内部编码,其它格式的编码要转换为这个编码才能在libxml2中使用。
libxml2 使用实例

libxml2 使用实例libxml2是一个用于解析和操作XML文档的开源库。
本文将介绍libxml2的使用实例,包括解析XML文档、遍历文档树、查询节点等常用操作。
一、解析XML文档libxml2提供了多种解析XML文档的方式,包括从文件、字符串、缓冲区等不同来源进行解析。
1. 从文件解析XML文档使用函数xmlReadFile可以从文件中读取XML文档并解析成文档对象。
示例代码如下:```cxmlDocPtr doc;doc = xmlReadFile("example.xml", NULL, 0);```2. 从字符串解析XML文档使用函数xmlReadMemory可以从字符串中解析XML文档。
示例代码如下:```cconst char *xmlStr = "<root><name>John</name></root>";xmlDocPtr doc;doc = xmlReadMemory(xmlStr, strlen(xmlStr), NULL, NULL, 0); ```3. 从缓冲区解析XML文档使用函数xmlReadIO可以从缓冲区中解析XML文档。
示例代码如下:```cFILE *fp = fopen("example.xml", "r");xmlParserCtxtPtr ctxt;ctxt = xmlNewParserCtxt();ctxt->input = xmlNewIOInputStream(ctxt, fp, XML_CHAR_ENCODING_NONE);xmlDocPtr doc;doc = xmlCtxtReadIO(ctxt, NULL, NULL, 0);```二、遍历文档树在解析XML文档后,我们可以通过遍历文档树来获取文档中的节点信息。
个人总结C语言下xml使用全集_libxml

LIBXML2库使用指南C++的XML编程经验――LIBXML2库使用指南写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言;2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介绍如何在windows平台下进行编程,更很少提到如何解决中文问题。
基于以上几点原因,决定写一个在Windows平台下,使用C/C++语言,应用LibXml2库来进行xml文档操作,同时使用ICONV库进行中文编码转换的文档。
其中还涉及了Makefile、XPATH等相关内容。
本文中所有的源代码在/Files/wxb_nudt/xml_src.rar。
1.下载与安装LIBXML2和ICONVLibxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。
Libxml2的下载地址是/,完全版的库是开源的,并且带有例子程序和说明文档。
最好将这个库先下载下来,因为这样可以查看其中的文档和例子。
windows版本的的下载地址是/libxml.en.html;这个版本只提供了头文件、库文件和dll,不包含源代码、例子程序和文档。
在文本中,只需要下载libxml2库、iconv库和zlib库就行了(注意,libxml2库依赖iconv和zlib库,本文中重点关注libxml2和iconv,zlib不介绍),我使用的版本是libxml2-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。
在编程的时候,我们使用windows版本的libxml2、zlib和iconv,将其解压缩到指定文件夹,例如D:"libxml2-2.6.30.win32,D:"zlib-1.2.3.win32以及D:"iconv-1.9.2.win32。
Windows环境下libxml2库的使用小结

Windows环境下libxml2库的使用小结(1)--环境的搭建,下载与安装LIBXML2和ICONVLibxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT 转换等功能。
Libxml2的下载地址是,完全版的库是开源的,并且带有例子程序和说明文档。
完全版的文件名为:libxml2-2.7.8.tar.gz。
Libxml2中默认的内码是UTF-8,所有使用libxml2进行处理的xml文件,必须首先显式或者默认的转换为UTF-8编码才能被处理。
要在xml中使用中文,就必须能够在UTF-8和GB2312内码(较常用的一种简体中文编码)之间进行转换。
Libxml2提供了默认的内码转换机制,并且在libxml2的Tutorial中有一个例子,事实证明这个例子并不适合用来转换中文。
所以需要我们显式的使用ICONV来进行内码转换,libxml2本身也是ICONV使用进行转换的。
ICONV是一个专门用来进行编码转换的库,基本上支持目前所有常用的编码。
它是glibc库的一个部分,常常被用于UNIX系统中。
当然,在windows 下面使用也没有任何问题。
其下载地址是,文件名为libiconv-1.9.2-1-lib.zip。
将libiconv-1.9.2-1-lib.zip解压,将其中的iconv.h放入C:\opt\include目录中,将其中的libiconv.lib放入C:\opt\lib中,并改名为iconv.lib.(没有opt目录就新建一个)。
解压libxml2-2.7.8.tar.gz文件到C盘根目录,在c:\libxml2-2.7.8\libxml2-2.7.8\win32目录中存放了多个Windows平台编译器的Makefile文件,我们使用vs2008,所以待会会用Makefile.msvc 文件。
1.进入Visual Studio 2008 Command Prompt;2.cd c:\libxml2-2.7.8\libxml2-2.7.8\win323.输入cscript configure.js compiler=msvc prefix=c:\opt include=c:\opt\include lib=c:\opt\lib debug=yes,回车执行。
libxml2 用法

libxml2 用法libxml2 是一种用于解析和操作XML 文件的C 语言库。
它提供了许多功能强大的API,可以在Linux、Windows 和Mac OS X 等操作系统上使用。
本文将介绍一些常用的libxml2 用法。
## 安装libxml2在Ubuntu 上安装libxml2 库可以使用以下命令:```sudo apt-get install libxml2-dev```在CentOS 上安装libxml2 库可以使用以下命令:```sudo yum install libxml2-devel```当然,在Windows 和Mac OS X 上安装libxml2 也非常简单,只需下载安装包并按照提示进行安装即可。
## 解析XML 文件libxml2 提供了许多解析XML 文件的API。
以下是一个简单的示例:```#include <libxml/parser.h>#include <libxml/tree.h>int main(){xmlDocPtr doc;xmlNodePtr cur;doc = xmlParseFile("example.xml");if (doc == NULL) {fprintf(stderr, "Failed to parse XML\\n");return 1;}cur = xmlDocGetRootElement(doc);if (cur == NULL) {fprintf(stderr, "empty document\\n");xmlFreeDoc(doc);return 1;}xmlFreeDoc(doc);return 0;}```这个示例使用`xmlParseFile` 函数解析`example.xml` 文件,并使用`xmlDocGetRootElement` 函数获取XML 文件的根节点。
libxml2 空节点 格式

libxml2是一个XML C语言工具包,用于解析、生成和操作XML文档。
在libxml2中,XML节点可以是空节点,也就是没有任何内容的节点。
空节点在XML文档中经常出现,并且在解析和处理XML时需要特别注意。
让我们来了解一下什么是空节点。
在XML中,节点是XML文档的基本构建块,可以包含元素、属性、文本、注释等内容。
一个空节点就是一个没有任何子节点或内容的节点,它可以作为一个独立的元素存在。
在libxml2中,空节点的处理和其他节点没有太大区别,但在操作空节点时需要特别注意一些细节。
在解析XML文档时,应用程序需要能够正确地识别和处理空节点。
这涉及到XML文档的有效性和结构完整性。
如果应用程序不能正确地处理空节点,可能会导致解析错误或者不完整的数据。
在使用libxml2解析XML文档时,需要注意空节点的处理。
为了正确地处理空节点,可以使用libxml2提供的API来检查和识别空节点,以确保解析和处理的准确性和完整性。
除了在解析XML文档时注意空节点外,还需要在生成和操作XML文档时特别关注空节点。
在使用libxml2生成XML文档时,可能需要在某些情况下创建空节点。
要正确地创建一个空节点,可以使用libxml2提供的API来创建一个空节点,并将其添加到相应的位置。
在操作XML文档时,也需要确保对空节点的正确处理,以避免数据的不完整或不准确。
空节点在XML文档中是一个常见的现象,而在使用libxml2解析、生成和操作XML文档时,需要特别注意空节点的处理。
正确地处理空节点可以保证XML文档的有效性和完整性,避免数据出现错误。
通过使用libxml2提供的API,可以轻松地识别、创建和操作空节点,从而更加灵活地处理XML文档。
个人观点和理解:在使用libxml2解析和处理XML文档时,空节点是一个必须要考虑的问题。
正确地处理空节点可以保证程序的稳定性和可靠性,而忽略空节点可能会导致程序出现错误或者不完整的数据。
libxml2的参考手册

libxml2的参考手册目录表•DOCBparser:旧的DocBook SGML解析器•HTMLparser:一个HTML 4.0非验证解析器接口•HTMLtree:特定的API来处理HTML树,特别是序列化•SAX:旧的SAX版本1处理程序,已过时•SAX2:SAX2解析器接口用于构建DOM树•C14N:提供规范的XML和专用XML规范化•catalog:目录处理系统的接口•chvalid:Unicode字符范围检查•debugXML:树调试的API•dict:字符串字典•encoding:编码转换功能界面•entities:接口,用于处理XML实体•globals:接口库中的所有全局变量•hashs:链式哈希表•list:列出接口•nanoftp:最小的FTP实现•nanohttp:最小的HTTP实现•parser:核心解析模块•parserInternals:分析器出口的内部例程。
•pattern:图案表达式处理•relaxng:RELAX - NG验证的实施•schemasInternals:XML架构的内部接口•Schematron的:XML Schemastron实施•threads:线程的处理接口•tree:树操纵接口•URI:通用的URI相关例程库•valid:DTD验证•XInclude:对XInclude的实施•XLINK:未完成的XLink检测模块•xmlIO:解析器所使用的I / O接口接口•xmlautomata:API构建的regexp自动机•xmlerror:错误处理•xmlexports:标记符号的宏导出/导入。
•xmlmemory:内存分配器接口•xmlmodule:动态加载模块•XmlReader的:XMLReader实现•xmlregexp:正则表达式处理•xmlsave:XML文档的序列化器•xmlschemas:不完整的XML模式结构的实现•xmlschemastypes:执行XML Schema数据类型•xmlstring:字符串处理例程•xmlunicode:Unicode字符的API •xmlversion:编译时的版本信息•XmlWriter:为XML写的API•XPath的:XML路径语言的实现•xpathInternals:XML路径语言实现的内部接口•XPointer的 API来处理XML指针。
利用libxml2解析xml文档

利⽤libxml2解析xml⽂档C程序⾥可以利⽤libxml2库去解析xml⽂档。
利⽤libxml2可以很轻松的解析,⽣成xml⽂件。
这⾥演⽰⼀个⼩例⼦,包含了遍历节点,获取节点属性与值,以及获取CDATA⾥⾯的内容。
测验的xml⽂件:<?xml version="1.0" encoding="utf-8"?><root name="test"><content><pro id="moonApple"><![CDATA[<say>i still have lots to work on</say>]]></pro><details><detail name="dancing">like it</detail><detail name="singing">poor , just listen</detail><detail name="laugh"/><detail name="eating"><![CDATA[<food>candy</food>]]></detail></details></content></root>test.c⽂件:#include<stdio.h>#include<string.h>#include<libxml/parser.h>#include<libxml/tree.h>int parse_xml_file(char *buf,int len){xmlDocPtr doc;xmlNodePtr root,node,detail;xmlChar *name,*value;doc=xmlParseMemory(buf,len); //parse xml in memoryif(doc==NULL){printf("doc == null\n");return -1;}root=xmlDocGetRootElement(doc);for(node=root->children;node;node=node->next){if(xmlStrcasecmp(node->name,BAD_CAST"content")==0)break;}if(node==NULL){printf("no node = content\n");return -1;}for(node=node->children;node;node=node->next){if(xmlStrcasecmp(node->name,BAD_CAST"pro")==0){ //get pro nodename=xmlGetProp(node,BAD_CAST"id");value=xmlNodeGetContent(node);printf("this is %s:\n%s\n",(char*)name,(char*)value); //get value, CDATA is not parse and don't take into value xmlFree(name);xmlFree(value);}else if(xmlStrcasecmp(node->name,BAD_CAST"details")==0){ //get details nodefor(detail=node->children;detail;detail=detail->next){ //traverse detail nodeif(xmlStrcasecmp(detail->name,BAD_CAST"detail")==0){name=xmlGetProp(detail,BAD_CAST"name");value=xmlNodeGetContent(detail);if(strlen((char*)value)!=0){printf("%s : %s\n",(char*)name,(char*)value);}else{printf("%s has no value\n",(char*)name);}xmlFree(name);xmlFree(value);}}}}xmlFreeDoc(doc);return 0;}int main(void){char *content;unsigned long filesize;FILE *file;if((file=fopen("testxml","r"))==NULL){perror("openf file error");}fseek(file,0,SEEK_END);filesize=ftell(file);rewind(file);content=(char *)malloc(filesize+1);memset(content,0,filesize+1);fread(content,1,filesize,file);fclose(file);printf("content:\n%s\n",content);if(parse_xml_file(content,filesize)<0){perror("parse xml failed");}return 0;}输出结果:this is moonApple:<say>i still have lots to work on</say>dancing : like itsinging : poor , just listenlaugh has no valueeating : <food>candy</food>这⾥主要关注XML⽂件⾥⾯的CDATA⾥⾯的内容~更具体的使⽤⽅法和其他细节可以访问官⽹和上⾯的连接~。
使用libxml2解析xml

使⽤libxml2解析xml book.xml<?xml version="1.0" encoding="UTF-8" ?><books><book2><name id="1">c primer plus111</name><author>unknow author</author><date>unknow date</date></book2><book111111><name>c++ 21天⼊门到精通</name><author>未知作者</author><date>未知⽇期</date></book111111></books>//// Created by gxf on 2020/2/6.//#include <stdio.h>#include <string.h>#include <libxml/parser.h>//#include <libxml/tree.h>void println(char *s);typedef struct {char *name;char *author;char *date;}book;void printBook(book book1);int main() {xmlDocPtr bookDocPtr;xmlNodePtr booksNodePtr;char *bookDocName = "/Users/gxf/CLionProjects/untitled/books.xml";// libxml默认将各个节点间的空格当作⼀个节点xmlKeepBlanksDefault(0);bookDocPtr = xmlParseFile(bookDocName);if (bookDocPtr == NULL) {fprintf(stderr, "xmlReadFile fail");exit(1);}book onebook;// root nodebooksNodePtr = xmlDocGetRootElement(bookDocPtr);// book nodexmlNodePtr bookNodePtr = booksNodePtr->children;while (bookNodePtr) {// namexmlNodePtr namePtr = bookNodePtr->children;// println(xmlNodeGetContent(namePtr)); = xmlNodeGetContent(namePtr);// authorxmlNodePtr authorPtr = namePtr->next;// println(xmlNodeGetContent(authorPtr));onebook.author = xmlNodeGetContent(authorPtr);// datexmlNodePtr datePtr = authorPtr->next;// println(xmlNodeGetContent(datePtr));onebook.date = xmlNodeGetContent(datePtr);printBook(onebook);bookNodePtr = bookNodePtr->next;}return 0;}void println(char *s) {printf("%s\n", s);}void printBook(book book1) {printf("name: %s\n", );printf("author: %s\n", book1.author);printf("date: %s\n", book1.date);} cmakelist# libxml2include_directories(/usr/local/include/libxml2) link_libraries(xml2)add_executable(libxml2-demo libxml2-demo.c) 。
个人总结C语言下xml使用全集_libxml

个人总结C语言下xml使用全集_libxml 在C语言下,libxml是一个非常强大和广泛使用的XML解析库。
它提供了一系列的API,用于解析、创建、修改和查询XML文档。
以下是我对libxml的个人总结。
首先,libxml提供了高效的XML解析功能。
它支持多种解析方式,包括DOM(文档对象模型)解析和SAX(简单API for XML)解析。
DOM解析将整个XML文档加载到内存中,形成一个树状结构,方便对XML文档进行修改和查询。
而SAX解析则是一种基于事件驱动的解析方式,逐行读取XML文档并触发相应的回调函数,适合处理大型XML文档。
其次,libxml提供了丰富的API,用于对XML文档进行操作。
它支持创建、修改和删除XML元素、属性和文本节点等操作。
同时,libxml还提供了一些高级功能,如命名空间支持、XPath查询和XInclude支持等。
XPath查询使得在XML文档中进行复杂的查询变得简单和高效,而XInclude支持可以将多个XML文档合并为一个。
此外,libxml还支持XML的验证和转换。
它可以通过DTD(文档类型定义)或XML Schema验证XML文档的合法性,并报告错误信息。
同时,libxml还提供了XML到HTML、XML到文本和XML到其他XML格式的转换功能,方便进行数据格式转换。
另外,libxml具有良好的跨平台性。
它支持在多种操作系统上运行,包括Windows、Linux和Mac OS等。
这使得开发人员可以在不同的平台上使用相同的代码和功能,提高了开发效率和代码的可移植性。
在使用libxml时,我发现它具有一些优点。
首先,它是一个开源的库,可以免费使用和修改。
其次,它的性能非常出色,能够处理大型的XML文档。
此外,libxml还具有良好的文档和示例,使得学习和使用变得更加容易。
然而,libxml也存在一些不足之处。
首先,它的API相对较为复杂,需要一定的学习成本。
libxml2剖析(3):使用教程

libxml2剖析(3):使用教程本文整理自官方使用教程。
示例文档story.xml如下:[html]view plaincopy1.<?xml version="1.0"?>2.<story>3.<storyinfo>4.<author>John Fleck</author>5.<datewritten>June 2, 2002</datewritten>6.<keyword>example keyword</keyword>7.</storyinfo>8.<body>9.<headline>This is the headline</headline>10.<para>This is the body text.</para>11.</body>12.</story>1、解析xml文档解析文档时只需要文档名和一个函数调用,再加上错误处理。
下面代码查找keyword节点并打印节点下的文本内容,如下:[cpp]view plaincopy1.#include <stdio.h>2.#include <string.h>3.#include <stdlib.h>4.#include <libxml/xmlmemory.h>5.#include <libxml/parser.h>6.7./* 解析storyinfo节点,打印keyword节点的内容 */8.void parseStory(xmlDocPtr doc, xmlNodePtr cur){9.xmlChar* key;10.cur=cur->xmlChildrenNode;11.while(cur != NULL){12./* 找到keyword子节点 */13.if(!xmlStrcmp(cur->name, (const xmlChar *)"keyword") ){14.key = xmlNodeListGetString(doc, cur->xmlChildrenNo de, 1);15.printf("keyword: %s\n", key);16.xmlFree(key);17.}18.cur=cur->next; /* 下一个子节点 */19.}20.21.return;22.}23.24./* 解析文档 */25.static void parseDoc(char *docname){26./* 定义文档和节点指针 */27.xmlDocPtr doc;28.xmlNodePtr cur;29.30./* 进行解析,如果没成功,显示一个错误并停止 */31.doc = xmlParseFile(docname);32.if(doc == NULL){33.fprintf(stderr, "Document not parse successfully. \n");34.return;35.}36.37./* 获取文档根节点,若无内容则释放文档树并返回 */38.cur = xmlDocGetRootElement(doc);39.if(cur == NULL){40.fprintf(stderr, "empty document\n");41.xmlFreeDoc(doc);42.return;43.}44.45./* 确定根节点名是否为story,不是则返回 */46.if(xmlStrcmp(cur->name, (const xmlChar *)"story")){47.fprintf(stderr, "document of the wrong type, root node != story");48.xmlFreeDoc(doc);49.return;50.}51.52./* 遍历文档树 */53.cur = cur->xmlChildrenNode;54.while(cur != NULL){55./* 找到storyinfo子节点 */56.if(!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo") ){57.parseStory(doc, cur); /* 解析storyinfo子节点 */58.}59.cur = cur->next; /* 下一个子节点 */60.}61.62.xmlFreeDoc(doc); /* 释放文档树 */63.return;64.}65.66.int main(int argc, char **argv){67.char *docname;68.if(argc <= 1){69.printf("Usage: %s docname\n", argv[0]);70.return 0;71.}72.docname=argv[1];73.parseDoc(docname);74.return 1;75.}解析XML文档的基本流程如下:(1)定义文档指针和节点指针。
Linux环境下C使用的XML解析库

注释 因为 xmlNodeListGetString 为它返回的字符串分配内存,你必须使用 xmlFree 释放它。
这个例子完整的代码参见附录 D,XPath 例程代码。
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,通力根1保过据护管生高线产中敷工资设艺料技高试术中卷0资不配料仅置试可技卷以术要解是求决指,吊机对顶组电层在气配进设置行备不继进规电行范保空高护载中高与资中带料资负试料荷卷试下问卷高题总中2体2资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况1卷中下安,与全要过,加度并强工且看作尽护下可1都关能可于地以管缩正路小常高故工中障作资高;料中对试资于卷料继连试电接卷保管破护口坏进处范行理围整高,核中或对资者定料对值试某,卷些审弯异核扁常与度高校固中对定资图盒料纸位试,置卷编.工保写况护复进层杂行防设自腐备动跨与处接装理地置,线高尤弯中其曲资要半料避径试免标卷错高调误等试高,方中要案资求,料技编试术写5、卷交重电保底要气护。设设装管备备置线4高、调动敷中电试作设资气高,技料课中并3术试、件资且中卷管中料拒包试路调试绝含验敷试卷动线方设技作槽案技术,、以术来管及避架系免等统不多启必项动要方高式案中,;资为对料解整试决套卷高启突中动然语过停文程机电中。气高因课中此件资,中料电管试力壁卷高薄电中、气资接设料口备试不进卷严行保等调护问试装题工置,作调合并试理且技利进术用行,管过要线关求敷运电设行力技高保术中护。资装线料置缆试做敷卷到设技准原术确则指灵:导活在。。分对对线于于盒调差处试动,过保当程护不中装同高置电中高压资中回料资路试料交卷试叉技卷时术调,问试应题技采,术用作是金为指属调发隔试电板人机进员一行,变隔需压开要器处在组理事在;前发同掌生一握内线图部槽 纸故内资障,料时强、,电设需回备要路制进须造行同厂外时家部切出电断具源习高高题中中电资资源料料,试试线卷卷缆试切敷验除设报从完告而毕与采,相用要关高进技中行术资检资料查料试和,卷检并主测且要处了保理解护。现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
libxml2他人笔记

libxml2他人笔记1.libxml2简介libxml2是一个实现读、创建及操纵XML数据功能的C语言库。
并且支持XPATH查询,以及部分的支持XSLT转换等功能。
libxml2的下载地址是ftp:///libxml2/,完全版的库是开源的,并且带有例子程序和说明文档。
libxml2包含一个脚本xml2-config,它一般用于编译和链接程序到库时产生标志。
为了取得预处理和编译标志,使用xml2-config --cflags,为了取得链接标志,使用xml2-config2.libxml2交叉编译与安装libxml2-2.6.11下载地址3.libxml2的数据类型与函数xmlChar是libxml2中的字符类型,库中所有字符、字符串都是基于这个数据类型。
还经常可以看到使用xmlChar*作为字符串类型,很多函数会返回一个动态分配内存的xmlDoc, xmlDocPtr 文档对象的结构体及其指针xmlNode xmlNodePtr 节点对象的结构体及其指针xmlAttr xmlAttrPtr 节点属性的结构体及其指针xmlNs xmlNsPtr 节点命名空间的结构及其指针非常重要的2个函数虽然这两个函数不在tree.h但对于使用tree.h中的函数很重要,所以在这里列出来<libxml/parser.h>int xmlKeepBlanksDefault (int val) //设置是否忽略空白节点,比如空格,在分析前必须调用,默认值是0,最好设置成1.否则会有惨痛的调试经历...xmlDocPtr xmlParseFile (const char * filename) //分析一个xml文件,并返回一个文档对象指针根节点相关函数xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc) //获取文档根节点xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root) //设置文档根节点创建子节点相关函数xmlNodePtr xmlNewNode (xmlNsPtr ns, const xmlChar * name) //创建新节点xmlNodePtr xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar * name, const xmlChar * content) //创建新的子节点xmlNodePtr xmlCopyNode (const xmlNodePtr node, int extended) //复制当前节点添加子节点相关函数xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur) //给指定节点添加子节点xmlNodePtr xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem) //添加后一个兄弟节点xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem) //添加前一个兄弟节点xmlNodePtr xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem) //添加兄弟节点属性相关函数xmlAttrPtr xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //创建新节点属性xmlChar * xmlGetProp (xmlNodePtr node, const xmlChar * name) //读取节点属性xmlAttrPtr xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //设置节点属性其他比较重要而且常用的函数xmlReadFile函数读入一个带有某种编码的xml文档,并返回文档指针;细节见libxml2参考手册。
使用libxml2生成xml

使用libxml2生成xml文档2009-06-25 23:30Libxml2是一个xml c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件。
它除了支持c语言版以外,还支持c++、PHP、Pascal、Ruby、Tcl等语言的绑定,能在Windows、Linux、Solaris、MacOsX等平台上运行。
Libxml2主要的优点有:1. 安装、使用比较简单,容易入门;2. 支持的编码格式较多,能很好的解决中文问题(使用一个很简单的编码转换函数);3. 支持Xpath解析(这点对于任意定位xml文档中的节点还是很有用的哦);4. 支持Well-formed和valid验证,具体而言支持DTD验证,Schema验证功能正在完善中(目前多数解析器都还不完全支持shema验证功能);5. 支持目前通用的Dom、Sax方式解析等等。
Libxml2的在linux下的编译安装:1. 从xmlsoft站点或ftp()站点下载libxml压缩包(libxml2-xxxx.tar.gz)2. 对压缩包进行解压缩: tar xvzf libxml2-xxxx.tar.gz3. 进入解压缩后的文件夹中运行: ./configure && make && make install 即可。
Libxml2的在windows下的编译安装:以libxml2-2.6.30为例,解压后,打开cmd窗口,进入libxml2-2.6.30目录:1. cd win322. cscript configure.js compiler=msvc debug=yes3. nmake /f Makefile.msvc(进入bin.msvc/目录就可以看到生成的库文件:libxml2.dll libxml2.liblibxml2_a.lib libxml2_a_dll.lib)4. nmake install, 因为第二步没有指定prefix,所以这里会在win32目录下生成三个目录include/lib/bin,将这三个目录copy到vc的相应目录(C:\Program Files\Microsoft Visual Studio\VC98)既可以在vc的工程中直接使用libxml2的头文件和库。
libxml2 交叉编译

libxml2 交叉编译libxml2是用于解析XML格式文档的C语言库。
为了在ARM平台上运行,需要进行交叉编译。
以下是在Linux下交叉编译libxml2的步骤:1. 安装交叉编译工具链根据目标平台选择合适的交叉编译工具链,例如ARM平台可使用arm-linux-gnueabihf工具链。
安装后将交叉编译器路径添加到环境变量中。
2. 下载libxml2源码从官网下载源码压缩包,解压后进入目录。
3. 配置编译选项执行以下命令进行配置:./configure --host=arm-linux --prefix=/usr/local/arm/libxml2 --without-zlib --without-iconv --without-python --disable-shared其中--host指定目标平台架构,--prefix指定安装路径。
由于嵌入式平台常常缺少zlib和iconv等库,可以使用--without选项跳过。
因为嵌入式平台上没有Python环境,所以也可以跳过相关编译选项。
由于我们要生成静态库,可以使用--disable-shared选项禁止生成动态库。
4. 编译执行make命令即可编译生成libxml2的静态库。
如果想要生成动态库,可以省略--disable-shared选项,并安装动态库文件。
5. 安装执行make install命令即可将编译生成的文件安装到指定路径。
6. 复制依赖库如果在程序中调用了zlib和iconv等库,需要将对应的库文件复制到目标平台上。
例如,在ARM平台上需要将libz.so和libiconv.so复制到/usr/local/arm/libxml2/lib目录下,使得程序能够正确运行。
以上是交叉编译libxml2的基本步骤,具体情况根据不同的平台和环境可能会有所差异,需要根据具体情况进行调整。
libxml2使用指南

Libxml2使用指南一、Libxml2介绍:Libxml2 是一个xml的c语言版的解析器,本来是为Gnom e项目开发的工具,是一个基于MIT License的免费开源软件。
它除了支持c语言版以外,还支持c++、PHP、Pascal、Ruby、Tcl等语言的绑定,能在Windows、Linux、Solaris、MacOsX等平台上运行。
功能还是相当强大的,相信满足一般用户需求没有任何问题。
二、Libxml2安装:一般如果在安装系统的时候选中了所有开发库和开发工具的话(Fedora Core系列下),应该不用安装,下面介绍一下手动安装:1) 从xm lsoft站点或ftp(ftp.xm )站点下载libxml压缩包(libxml2-xxxx.tar.gz)2) 对压缩包进行解压缩:tar xvzf libxml2-xxxx.tar.gz3) 进入解压缩后的文件夹中运行:A)./configure B)m ake C)m ake install4)编译:$gcc test.c -o test -I /usr/local/include/libxml2/ -L /usr/local/lib -lxml2安装完成后就可以使用简单的代码解析XML文件,包括本地和远程的文件,但是在编码上有一些问题。
Libxm l默认只支持UTF-8的编码,无论输入输出都是UTF-8,所以如果你解析完一个XML 得到的结果都是UTF-8的,如果需要输出GB2312或者其它编码,需要ICONV来做转码(生成UTF-8编码的文件也可以用它做),如果系统中没有安装i conv的话,需要安装libiconv。
1) 下载libiconv压缩包(例如libiconv-1.11.tar.gz)2) 对压缩包进行解压缩:tar xvzf libiconv-1.11.tar.gz3) 进入解压缩后的文件夹中运行:A)./configure B)m ake C)m ake install三、关于XML:在开始研究Libxm l2 库之前,先了解一下XML的相关基础。
libxml2的安装及使用[总结]
![libxml2的安装及使用[总结]](https://img.taocdn.com/s3/m/20b3a52342323968011ca300a6c30c225901f006.png)
libxml2的安装及使⽤[总结]1、前⾔2、libxml2的安装具体安装步骤:1、解压:$tar zxvf libxml2-2.9.1.tar.gz2、进⼊解压后的安装⽬录:$cd libxml2-2.9.13、安装三部曲: 1)$./configure2)$make3)$make install安装完毕。
注意:libxml2默认安装到/usr/local/include/libxml2⽬录下3、xml⽂档结构 xml按照树形结构进⾏存储,节点分为元素和⽂本,必须有根节点。
如下的xml⽂件:<?xml version="1.0" encoding="UTF-8"?><phone_books><phone id="1"><name>Anker</name><tel>189********</tel><address>Shenzheng</address></phone><phone id="2"><name>Jermey</name><tel>186********</tel><address>Beijing</address></phone><phone id="3"><name>Lili</name><tel>132********</tel><address>Shanghai</address></phone></phone_books>xml结构图如下所⽰:4、测试例⼦ 内部字符类型:xmlChar,定义为:typedef unsigned char xmlChar,⽤⽆符号型的char⽅便表⽰utf-8编码。
xmlbuilder2 使用说明

XMLBuilder2 使用说明一、XMLBuilder2 简介XMLBuilder2 是一个用于创建和操作 XML 文档的 JavaScript 库。
它可以用于在浏览器端和服务器端环境中构建和处理 XML 文档。
XMLBuilder2 提供了简单易用的 API,使用户可以轻松地创建、修改和查询 XML 文档。
本文将介绍 XMLBuilder2 的基本用法和一些高级功能,帮助用户更好地使用该库来处理 XML 文档。
二、安装与引入1. 使用 npm 安装您需要在命令行中执行以下命令来安装 XMLBuilder2:```npm install xmlbuilder2```2. 引入 XMLBuilder2在您的 JavaScript 代码中,您可以使用 require 或 import 语句来引入 XMLBuilder2:```javascript// 使用 require 引入const { create } = require('xmlbuilder2');// 或者使用 import 引入import { create } from 'xmlbuilder2';```三、创建 XML 文档1. 创建一个空的 XML 文档要创建一个空的 XML 文档,您可以直接调用 create() 方法:```javascriptconst xml = create();```2. 创建具有根元素的 XML 文档如果您想创建一个带有根元素的 XML 文档,可以使用 element() 方法:```javascriptconst xml = create('root');```这将创建一个具有名称为 "root" 的根元素的 XML 文档。
四、添加元素和属性1. 添加元素您可以使用 ele() 方法在 XML 文档中添加新元素:```javascriptconst xml = create('root').ele('child');```这样就在名为 "root" 的根元素下创建了一个名为 "child" 的子元素。
[libxml2]_[XML处理]_[使用libxml2的xpath特性修改xml文件内容]
![[libxml2]_[XML处理]_[使用libxml2的xpath特性修改xml文件内容]](https://img.taocdn.com/s3/m/3ba624aec67da26925c52cc58bd63186bceb9222.png)
[libxml2]_[XML处理]_[使⽤libxml2的xpath特性修改xml⽂件内容]场景:1.在软件需要保存⼀些配置项时,使⽤数据库的话⽐较复杂,查看内容也不容易.纯⽂本⽂件对utf8字符⽀持也不好.2.这时候使⽤xml是最佳选择,使⽤跨平台库libxml2。
3.基于xpath的保存⽅式对保存局部内容⾮常⽅便。
4.参考例⼦xpath2.c1 #include <stdio.h>2 #include <assert.h>3 #include <string>4 #include <iostream>5 #include <map>67 #include "libxml/tree.h"8 #include "libxml/parser.h"9 #include "libxml/xpath.h"10 #include "libxml/xpathInternals.h"11 #include "libxml/xmlsave.h"1213using namespace std;1415static void _UpdateXpathNodes(xmlNodeSetPtr nodes, const xmlChar* value)16 {17int size;18int i;1920 assert(value);21 size = (nodes) ? nodes->nodeNr : 0;22for(i = size - 1; i >= 0; i--)23 {24 assert(nodes->nodeTab[i]);25 xmlNodeSetContent(nodes->nodeTab[i], value);26if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL)27 {28 nodes->nodeTab[i] = NULL;29 }30 }31 }3233static int _UpdateWithXpath(xmlXPathContextPtr xpathCtx,const char* key,const char* value)34 {35 xmlXPathObjectPtr xpathObj;3637 xpathObj = xmlXPathEvalExpression(BAD_CAST key, xpathCtx);38if(!xpathObj)39 {40 fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", key);41return -1;42 }43 _UpdateXpathNodes(xpathObj->nodesetval, BAD_CAST value);44 xmlXPathFreeObject(xpathObj);45return0;46 }4748static int _UpdateXml(const char* path,map<string,string>& keyValue)49 {50 xmlDocPtr doc;51 xmlXPathContextPtr xpathCtx;52 doc = xmlParseFile(path);53if (!doc)54 {55 fprintf(stderr, "Error: unable to parse file \"%s\"\n", path);56return(-1);57 }5859/* Create xpath evaluation context */60 xpathCtx = xmlXPathNewContext(doc);61//1.注意,这⾥根Node有声明xmlns,那么必须加下边这句,相应的xpath要加前缀 /c:container/c:rootfiles62//xmlXPathRegisterNs(xpathCtx,BAD_CAST"c",BAD_CAST"urn:oasis:names:tc:opendocument:xmlns:container");63if(!xpathCtx)64 {65 fprintf(stderr,"Error: unable to create new XPath context\n");66 xmlFreeDoc(doc);67return(-1);69//3.update70 map<string,string>::iterator iter;71 map<string,string>::iterator end = keyValue.end();72for(iter = keyValue.begin();iter!= end;iter++)73 {74 cout << "word: " << iter->first << ", count: " << iter->second << endl;75 _UpdateWithXpath(xpathCtx,iter->first.c_str(),iter->second.c_str());76 }7778 xmlXPathFreeContext(xpathCtx);79//4.save80 xmlSaveCtxtPtr saveCtxtPtx = xmlSaveToFilename(path,"UTF-8",XML_SAVE_FORMAT); 81if(!saveCtxtPtx)82 {83 xmlFreeDoc(doc);84return -1;85 }8687if(-1 == xmlSaveDoc(saveCtxtPtx,doc))88 {89 xmlFreeDoc(doc);90return -1;91 }92 xmlSaveClose(saveCtxtPtx);93//xmlDocDump(stdout, doc);94//5.free95 xmlFreeDoc(doc);96return0;97 }9899int UpdateXml(const char* path,map<string,string>& keyValue)100 {101/* Init libxml */102 xmlInitParser();103int res = _UpdateXml(path,keyValue);104 xmlCleanupParser();105return res;106 }107108int main(int argc, char *argv[])109 {110 printf("Hello, world\n");111 map<string,string> m;112 m["/doc/parent/discarded/@info"] = string("info attri");113 m["/doc/parent/discarded[2]"] = string("change second discarded text 中⽂");114int ret = UpdateXml("xpath2.res",m);115 assert(!ret);116 ret = UpdateXml("xpath2.res",m);117 assert(!ret);118 ret = UpdateXml("xpath2.res",m);119 assert(!ret);120return0;121 }xpath2.res<?xml version="1.0" encoding="UTF-8"?><doc><parent><discarded info="test">discarded</discarded><preserved/>This text node must be discarded<discarded>test</discarded><preserved>content1<child1/><child2>content2</child2><preserved>too</preserved><child2>content3</child2><preserved/><child2>content4</child2><preserved/><child2>content5</child2>content6</preserved></parent></doc>xpath2.res<?xml version="1.0" encoding="UTF-8"?><doc><discarded info="info attri">discarded</discarded><preserved/>This text node must be discarded<discarded>change second discarded text 中⽂</discarded> <preserved>content1<child1/><child2>content2</child2><preserved>too</preserved><child2>content3</child2><preserved/><child2>content4</child2><preserved/><child2>content5</child2>content6</preserved></parent></doc>View Code。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有两种方法来编译链接基于libxml2的程序,第一种是在VC环境中设置lib和include路径,并在link设置中添加libxml2.lib和iconv.lib;第二种是用编译器选项告诉编译器cl.exe头文件的位置,并用链接器选项告诉链接器link.exe库文件的位置,同时在windows环境变量path中添加libxml2中bin文件夹的位置,以便于程序运行时可以找到dll(也可以将dll拷贝到system32目录下)。显然我选择了第二种,那么编译链接一个名为CreateXmlFile.cpp源文件的命令如下:
基于以上几点原因,决定写一个在Windows平台下,使用C/C++语言,应用LibXml2库来进行xml文档操作,同时使用ICONV库进行中文编码转换的文档。其中还涉及了Makefile、XPATH等相关内容。本文中所有的源代码在/libxml.en.html;这个版本只提供了头文件、库文件和dll,不包含源代码、例子程序和文档。在文本中,只需要下载libxml2库、iconv库和zlib库就行了(注意,libxml2库依赖iconv和zlib库,本文中重点关注libxml2和iconv,zlib不介绍),我使用的版本是libxml2-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。
注意:要在path变量中加上D:&uot;iconv-1.9.2.win32&uot;bin;D:&uot;zlib-1.2.3.win32&uot;bin;D:&uot;libxml2-2.6.30.win32&uot;bin这三个地址,否则在执行的时候就找不到。或者使用更简单的方法,把其中的三个dll到拷贝到system32目录中。
言;
2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;
3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介绍如何在windows平台下进行编程,更很少提到如何解决中文问题。
在编程的时候,我们使用windows版本的libxml2、zlib和iconv,将其解压缩到指定文件夹,例如D:&uot;libxml2-2.6.30.win32,D:&uot;zlib-1.2.3.win32以及D:&uot;iconv-1.9.2.win32。事实上,我们知道在windows下面使用头文件、库文件和dll是不需要安装的,它又没有使用任何需要注册的组件或者数据库,只需要告诉编译器和链接器这些资源的位置就可以了。
cl /c /I D:&