libxml2库函数详解
许多事物符合80/20法则,libxml中也是20%的函数提供了80%的功能。下面的列表列出了libxml的主要函数及其用法说明。
1. 全局函数说明
|
头文件引用 |
xml2config --cflags |
|
库文件引用 |
xml2config --libs |
|
主要头文件 |
parse.h tree.h xpath.h |
|
简单例程 |
Makefile: INCLUDE=-I./ -I$HOME/include `xml2config --cflags` LIBRARY=-L./ -L$HOME/lib `xml2config --libs` *.c或*.cpp #include <libxml/parse.h> #include <libxml/tree.h> #include <libxml/xpath.h> |
|
函数功能 |
在分析XML数据是,去除空白字符。如果不去除空白字符,则这些字符也会被当做一个node来处理 |
|
函数接口 |
int xmlKeepBlanksDefault(int val) |
|
参数说明 |
val:0或者1。0表示去除空白字符,1表示不去除 返回值:0表示设置失败,1表示设置成功,一般不用判断 |
|
简单例程 |
xmlKeepBlanksDefault(0); |
2. XML文件载入和保存函数
|
函数功能 |
将XML文件从硬盘上载入到内存中,并且生成DOM树。使用完毕之后,需要用xmlFreeDoc()来释放资源 |
|
函数接口 |
xmlDocPtr xmlParseFile(const char * filename) |
|
参数说明 |
filename:XML文件名称。 返回值:如果载入成功,则返回这个文档的根节点。否则返回NULL |
|
简单例程 |
xmlDodPtr pdoc; pdoc = xmlParseFile("123.xml"); if( pdoc == NULL ) { printf("Fail to parse XML file.\n"); } |
|
函数功能 |
将内存中的DOM树,保存到硬盘上,生成一个带格式的XML文件 |
|
函数接口 |
int xmlSaveFormatFileEnc(const char * filename, xmlDocPtr cur, const char * encoding, int format) |
|
参数说明 |
filename:需要保存的文件的名称 cur:需要保存的XML文档 encoding:导出文件的编码类型,或者为NULL format:是否格式化。0表示不格式化,1表示需要格式化。注意:只有当xmlIndentTreeOutput设置为1,或者xmlKeepBlanksDefault(0)时,format设置为1才能生效 返回值:写入文件中的字节数量 |
|
简单例程 |
xmlDodPtr pdoc; pdoc = xmlParseFile("123.xml"); if( pdoc == NULL ) { printf("Fail to parse XML file.\n"); } Do_something_with_pdoc(); int filesize; filesize = xmlSaveFormatFileEnc("321.xml", pdoc, "gb2312",1); if(filesize == -1) { printf("Fail to save XML to file.\n"); } |
3. XML内存载入和输出函数
|
函数功能 |
将一块内存中的XML数据生成一个DOM树。使用完毕之后,需要用xmlFreeDoc()来释放资源 |
|
函数接口 |
xmlDocPtr xmlParseMemory(const char * buffer, int size) |
|
参数说明 |
buffer:存放XML格式数据的内存区 size:内存中XML格式数据的长度 返回值:如果载入成功,则返回这个文档的根节点;否则返回NULL |
|
简单例程 |
char *buffer; int size; xmlDocPtr pdoc; // read_data_to_buffer buffer = …… size = strlen(buffer); pdoc = xmlParseMemory(buffer, size); if( pdoc == NULL) { printf("Fail to parse XML buffer.\n"); } |
|
函数功能 |
将DOM树导出到内存中,形成一个XML格式的数据 |
|
函数接口 |
void xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar ** doc_txt_ptr, int * doc_txt_len, const char * txt_encoding, int format) |
|
参数说明 |
out_doc:需要输出成为一个buffer的XML文档 doc_txt_ptr:输出文档的内存区。由该函数在内部申请。使用完成之后,必须调用xmlFree()函数来释放该内存块 doc_txt_len:输出文档内存区的长度 txt_encoding:输出文档的编码类型 format:是否格式化。0表示不格式化,1表示需要格式化。注意只有当xmlIndentTreeOutput设置为1,或者xmlKeepBlanksDefault(0)时,format设置为1才能生效 |
|
简单例程 |
xmlChar *outbuf; int outlen; xmlDocPtr pdoc; pdoc = …… xmlDocDumpFormatMemoryEnc(pdoc, &outbuf, &outlen, "gb2312", 1); xmlFree(outbuf); |
4. 创建和释放XML文档函数
|
函数功能 |
在内存中创建一个新的XML文档。所创建的文档需要使用xmlFreeDoc()来释放资源 |
|
函数接口 |
xmlDocPtr xmlNewDoc (const xmlChar * version) |
|
参数说明 |
version:XML标准的版本,目前只能指定为“1.0” |
|
简单例程 |
xmlDocPtr pdoc ; pdoc = xmlNewDoc((const xmlChar*)"1.0"); if( pdoc == NULL ) { printf(“Fail to create new XML doc.\n”); } |
|
函数功能 |
释放内存中的XML文档 |
|
函数接口 |
void xmlFreeDoc(xmlDocPtr cur) |
|
参数说明 |
cur:需要释放的XML文档 |
|
简单例程 |
xmlDocPtr pdoc ; pdoc = xmlNewDoc((const xmlChar*)"1.0"); if( pdoc == NULL ) { printf(“Fail to create new XML doc.\n”); } xmlFreeDoc(podc); |
5. XML节点操作函数
|
函数功能 |
获得根节点 |
|
函数接口 |
xmlNodePtr xmlDocGetRootElement(xmlDocPtr doc) |
|
参数说明 |
doc:XML文档句柄。 返回值:XML文档的根节点,或者NULL。 |
|
使用流程 |
① 解析好文档的根节点指针,应用使用该指针可以遍历XML文件 ② xmlNodePtr的next字段,指向下一个同级XML节点 ③ properties字段为xmlAttr类型,指向该XML节点的属性 ④ children字段为xmlNodePtr类型,指向该XML节点的子节点 |
|
简单例程 |
xmlDocPtr pdoc ; xmlNodePtr root ; pdoc = xmlParseFile("123.xml"); if( pdoc == NULL ) { printf("Fail to parse XML File.\n"); return ; } root = xmlDocGetRootElement(pdoc); if( root == NULL) { printf("Fail to get root element\n"); return; } |
|
函数功能 |
设置根节点 |
|
函数接口 |
xmlNodePtr xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root) |
|
参数说明 |
doc:XML文档句柄 root:XML文档的新的根节点 返回值:如果该文档原来有根节点,则返回根节点,否则返回NULL |
|
简单例程 |
xmlDocPtr pdoc ; xmlNodePtr root; pdoc = xmlNewDoc((const xmlChar*)"1.0"); if( pdoc == NULL ) { printf("Fail to create new XML doc.\n"); return; } root = xmlNewDocNode(pdoc, NULL, (const xmlChar*)"root", NULL); if( root == NULL ) { printf("Fail to create doc node.\n"); return ; } xmlDocSetRootElement(pdoc, root); |
|
函数功能 |
获得节点的内容 |
|
函数接口 |
xmlChar * xmlNodeGetContent (xmlNodePtr cur) |
|
参数说明 |
cur:节点的指针 返回值:节点的文本内容。如果该节点没有文本内容,则返回NULL。当返回值不为NULL时,需要用xmlFree()函数来释放返回的资源 |
|
简单例程 |
xmlNodePtr node; xmlChar* content; node = …. content = xmlNodeGetContent(node); xmlFree(content); |
|
函数功能 |
设置节点的内容长度 |
|
函数接口 |
void xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar * content, int len) |
|
参数说明 |
cur:节点的指针 content:节点的新文本内容 len:节点新文本内容的长度 |
|
简单例程 |
xmlNodePtr node; xmlChar* content; int len; content = (xmlChar*)"1234567890"; len = strlen((char*)content); xmlNodeSetContentLen(node, content, len); |
|
函数功能 |
在节点的内容后面添加新的内容 |
|
函数接口 |
void xmlNodeAddContentLen(xmlNodePtr cur, const xmlChar * content, int len) |
|
参数说明 |
cur:节点的指针 content:节点的新加的文本内容 len:节点新加的文本内容的长度 |
|
简单例程 |
xmlNodePtr node; xmlChar* content; int len; content = (xmlChar*)"1234567890"; len = strlen((char*)content); xmlNodeAddContentLen(node, content, len); |
|
函数功能 |
获得节点的属性 |
|
函数接口 |
xmlChar * xmlGetProp(xmlNodePtr node, const xmlChar * name) |
|
参数说明 |
node:XML节点的指针 name:该节点的属性的名称 返回值:该属性的值或者为NULL。如果不为NULL,则需要用xmlFree()来释放资源 |
|
简单例程 |
xmlNodePtr node; xmlChar* prop; node = …. prop = xmlGetProp(node, (const xmlChar*)"name"); if( prop != NULL) xmlFree(prop); |
|
函数功能 |
设置节点的属性(如果该属性已经存在,则替换其值) |
|
函数接口 |
xmlAttrPtr xmlSetProp(xmlNodePtr node, const xmlChar * name, const xmlChar * value) |
|
参数说明 |
node:需要设置属性的节点 name:属性的名称 value:属性的值 返回值:该属性节点的指针 |
|
简单例程 |
xmlNodePtr node; xmlAttrPtr attr; node = …. attr = xmlSetProp(node, (cosnt xmlChar*)"Dept-Name", (const xmlChar*)"ES"); if( attr == NULL) { printf("Fail to set prop of this node.\n"); } |
6. XPath函数
|
函数功能 |
生成xpath的上下文关系句柄 |
|
函数接口 |
xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc) |
|
参数说明 |
doc:需要处理的XML文档 返回值:该文档的XPath上下文关系句柄或者NULL。该返回句柄由函数内部申请,此函数调用者需要用xmlXPathFreeContext来释放 |
|
简单例程 |
xmlDocPtr pdoc; xmlXPathContextPtr xpathctx; pdoc = …. xpathctx = xmlXPathNewContext(pdoc); if( xpathctx != NULL) xmlXPathFreeContext(xpathctx); |
|
函数功能 |
释放xpath的上下文关系句柄 |
|
函数接口 |
void xmlXPathFreeContext(xmlXPathContextPtr ctxt) |
|
参数说明 |
ctxt:需要释放的xpath上下文关系句柄 |
|
简单例程 |
参见xmlXPathNewContext()的例程 |
|
函数功能 |
执行xpath的表达式,返回结果内容节点集合 XPath表达式的表示方法,请参考: http://www.zvon.org/xxl/XPathTutorial/General/examples.html |
|
函数接口 |
xmlXPathObjectPtr xmlXPathEvalExpression (const xmlChar * str, xmlXPathContextPtr ctxt) |
|
参数说明 |
str:xpath表达式 ctxt:xpath的上下文关系句柄 返回值:满足表达式的结果集合或者为NULL。该返回句柄由函数内部申请,此函数调用者需要用xmlXPathFreeObject()来释放 |
|
简单例程 |
xmlDocPtr pdoc; xmlXPathContextPtr xpathctx; xmlXPathObjectPtr xpathobj; pdoc = …. xpathctx = xmlXPathNewContext(pdoc); if( xpathctx == NULL) { printf("Fail to create xpath context.\n"); return ; } Xpathobj = xmlXPathEvalExpression(BAD_CAST "//@value", xpathctx); if( xpathobj == NULL) { printf("Fail to evaluate xpath expression.\n"); xmlXPathFreeContext(xpathctx); return; } xmlXPathFreeObject(xpathobj); xmlXPathFreeContext(xpathctx); 结果集说明: xpathobj-> nodesetval:存储结果列表,如果为NULL,表示无结果 xpathObj->nodesetval->nodeNr:表示结果的数量 xpathObj->nodesetval->nodeTab:表示结果的数组,可以通过下标访问 例如: int number; xmlNodePtr node; if( xpathobj-> nodesetval == NULL) number = 0; else number = xpathObj->nodesetval->nodeNr; for(int i=0;i<number;i++) { node = xpathObj->nodesetval->nodeTab[i]; do_some_work_with_node(); } |
|
函数功能 |
释放xpath表达式运算结果集 |
|
函数接口 |
void xmlXPathFreeObject(xmlXPathObjectPtr obj) |
|
参数说明 |
obj:需要释放的xpath表达式运算结果集合 |
|
简单例程 |
参见xmlXPathEvalExpression()的例程 |
7. XML常见使用函数列表
下文是对XML常见使用函数的简要说明,有些函数的具体说明见上面的表格。
<libxml/parser.h>
int xmlKeepBlanksDefault (int val) //设置是否忽略空白节点,比如空格,在分析前必须调用,默认值是0,最好设置成1。
xmlDocPtr xmlParseFile (const char * filename) //分析一个xml文件,并返回一个文档对象指针
<libxml/tree.h>
//xml操作的基础结构提及其指针类型
//xmlDoc xmlDocPtr 文档对象的结构体及其指针
//xmlNode xmlNodePtr 节点对象的结构体及其指针
//xmlAttr xmlAttrPtr 节点属性的结构体及其指针
//xmlNs xmlNsPtr 节点命名空间的结构及其指针
//根节点相关函数
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) //设置节点属性
//作用同尾部同名的字符串函数。只不过针对相应的xml节点
xmlChar* xmlStrcat (xmlChar *cur, const xmlChar * add)
const xmlChar *xmlStrchr(const xmlChar * str, xmlChar val)
int xmlStrcmp (const xmlChar * str1, const xmlChar * str2)
int xmlStrlen (const xmlChar * str)
xmlChar *xmlStrncat (xmlChar * cur, const xmlChar * add, int len)
int xmlStrncmp (const xmlChar * str1, const xmlChar * str2, int len)
const xmlChar *xmlStrstr (const xmlChar * str, const xmlChar * val
libxml2库函数详解的更多相关文章
- STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ...
- C程序中对时间的处理——time库函数详解
包含文件:<sys/time.h> <time.h> 一.在C语言中有time_t, tm, timeval等几种类型的时间 1.time_t time_t实际上是长整数类型, ...
- Arduino String.h库函数详解
此库中包含 1 charAT() 2 compareTo() 3 concat() 4 endsWith() 5 equals() 6 equalslgnoreCase() 7 getBytes() ...
- XML_CPP_资料_libxml2库函数详解
http://blog.csdn.net/hanchaoman/article/details/42557195 许多事物符合80/20法则,libxml中也是20%的函数提供了80%的功能.下面的列 ...
- STM32F4时钟配置库函数详解
在STM32中,所有的应用都是基于时钟,所以时钟的配置就尤为重要了,而不能仅仅只知道使用默认时钟. STM32F4的时钟树如上图所示,HSE为外部接入的一个8M的时钟,然后再给PLL提供输入时钟,经过 ...
- Lua基础---lua字符串库函数详解,实例及正则表达式
参考这个网友写的,比较简单容易理解. http://blog.csdn.net/wlgy123/article/details/49206183
- Arduino Wire.h(IIC)库函数详解
此库中包含 1 Wire.begin() 2 Wire.requestFrom() 3 Wire.beginTransmission() 4 Wire.endTransmission() 5 Wire ...
- 单片机STM32在开发中常用库函数详解
1.GPIO初始化函数 用法: voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure;//GPIO状态恢复默认参数 GPI ...
- [转]keil使用详解
第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...
随机推荐
- jQuery序列化表单 serialize() serializeArray()
1.serialize()方法 描述:序列化表单内容为字符串,用于Ajax请求. 格式:var data = $(form).serialize(); 2.serializeArray()方法 描述: ...
- 【研究】CVE-2015-1635-HTTP.SYS远程执行代码漏洞(ms15-034)
1.1.1 漏洞描述 在2015年4月安全补丁日,微软发布的众多安全更新中,修复了HTTP.sys中一处允许远程执行代码漏洞,编号为:CVE-2015-1635(MS15-034 ).利用HTTP. ...
- 在Vue中由后台数据循环生成多选框CheckBox时的注意事项
多选框是一种非常常见的功能,有时候我们会根据后台返回的数据进行多选框渲染,之前做项目时遇到循环生成多选框时,v-model绑定的值会随着选中与取消改变,但页面却不会变化 的情况,后来测试了一下,发现多 ...
- Linux Jenkins
部署与运行: Jenkins 依赖于 Tomcat 才能跑起来,把 Jenkins 的 jenkins.war 文件放到 Tomcat 的安装目录的 webapps 目录下,配置好端口,正常访问 lo ...
- HTML练习 | 百度搜索框
<!DOCTYPE html> <head> <title>百度首页</title> <style> .logo{ background:u ...
- GitHub(hexo)博客页面访问量错误以及中文乱码解决
如果访问量不显示(乱码形状),是因为不蒜子域名更新,所以你的域名也需要更新 <script async src="//busuanzi.ibruce.info/busuanzi/2.3 ...
- React.js 小书 Lesson16 - 实战分析:评论功能(三)
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson16 转载请注明出处,保留原文链接和作者信息. 接下来的代码比较顺理成章了.修改 Commen ...
- mysql根据某个字段分组根据更新时间获取最新的记录
我现在有一种统计表,要根据一个字段分组然后根据更新时间,每个分组获取最新的一条记录.命名感觉挺简单的一个需求,然而没什么思路,当然是问度娘了. 度娘的答案很统一,然而都不管用,都是报错的,不知道是不是 ...
- ebiao 报表工具使用入门
一.ebiao简价 e表是一个功能强大的Web报表工具,可使复杂报表的设计简单化,避免了大量的复杂SQL编写以及编程来准备数据,报表设计的效率大大提高.e表分为e表 for .NET和e表 for J ...
- 初学Hadoop之计算TF-IDF值
1.词频 TF(term frequency)词频,就是该分词在该文档中出现的频率,算法是:(该分词在该文档出现的次数)/(该文档分词的总数),这个值越大表示这个词越重要,即权重就越大. 例如:一篇文 ...