http://zacaosansan.spaces.live.com/Blog/cns!20F577789A0BB695!206.entry
解析xml文档
解析一个xml文档,从中取出想要的信息,例如节点中包含的文字,或者某个节点的属性,其流程如下:
用xmlReadFile函数读出一个文档指针doc;
用xmlDocGetRootElement函数得到根节点curNode;
curNode->xmlChildrenNode就是根节点的子节点集合;
轮询子节点集合,找到所需的节点,用xmlNodeGetContent取出其内容;
用xmlHasProp查找含有某个属性的节点;
用xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存。
3.4 使用XPATH查找xml文档
简而言之,XPATH之于xml,好比sql之于关系数据库。要在一个复杂的xml文档中查找所需的信息,XPATH简直是必不可少的工具。
XPATH语法简单易学,并且有一个很好的官方教程,见http://www.zvon.org/xxl/XPathTutorial/Output_chi/introduction.html。
这个站点的XML各种教程齐全,并且有包括中文在内的各国语言版本,真是让我喜欢到非常!
使用XPATH之前,必须首先熟悉几个数据类型和函数,它们是使用XPATH的前提。在libxml2中使用Xpath是非常简单的,其流程如下:
调用 xmlParseFile 来从文件中获得新的 XML 文档
定义一个XPATH上下文指针xmlXPathContextPtr context,并且使用xmlXPathNewContext函数来初始化这个指针;
定义一个XPATH对象指针xmlXPathObjectPtr result,并且使用xmlXPathEvalExpression函数来计算Xpath表达式,得到查询结果,将结果存入对象指针中;
使用result->nodesetval得到节点集合指针,其中包含了所有符合Xpath查询结果的节点;
使用xmlXPathFreeContext释放上下文指针;
使用xmlXPathFreeObject释放Xpath对象指针;
3.5
内部字符类型xmlChar
xmlChar是Libxml2中的字符类型,库中所有字符、字符串都是基于这个数据类型。事实上它的定义是:xmlstring.h
typedef unsigned char xmlChar;
使用unsigned char作为内部字符格式是考虑到它能很好适应UTF-8编码,而UTF-8编码正是libxml2的内部编码,其它格式的编码要转换为这个编码才能在libxml2中使用。
还经常可以看到使用xmlChar*作为字符串类型,很多函数会返回一个动态分配内存的xmlChar*变量,使用这样的函数时记得要手动删除内存。
2.2 xmlChar相关函数
如同标准c中的char类型一样,xmlChar也有动态内存分配、字符串操作等相关函数。例如xmlMalloc是动态分配内存的函数;xmlFree是配套的释放内存函数;xmlStrcmp是字符串比较函数等等。
基本上xmlChar字符串相关函数都在xmlstring.h中定义;而动态内存分配函数在xmlmemory.h中定义。
2.3 xmlChar*与其它类型之间的转换
另外要注意,因为总是要在xmlChar*和char*之间进行类型转换,所以定义了一个宏BAD_CAST,其定义如下:xmlstring.h
#define BAD_CAST (xmlChar *)
原则上来说,unsigned char和char之间进行强制类型转换是没有问题的。
版权声明:本文为博主原创文章,未经博主允许不得转载。