libxml2解析xml总结
- 开发平台:linux
- IDE:eclipse
- 语言:c
使用libxml2对xml进行解析有两种方法,一种是纯使用libxml2提供的接口,另一种是使用xpath。只使用libxml2的接口需要进行多层的循环嵌套,比较麻烦,相对来说xpath封装的更好,使用起来更方便。下面具体来描述libxml2的函数以及使用xpath的方法。
代码块
下面是一个使用xpath的例子,其中tim_subtract.h是一个计算时间差的函数,方便统计程序的执行时间:
#include <stdio.h>
#include <stdlib.h>
#include <parser.h>
#include <tree.h>
#include <xpath.h>
#include <xpathInternals.h>
#include <xmlmemory.h>
#include <xpointer.h>
#include "tim_subtract.h"
//使用xpath来获得目标结点
xmlXPathObjectPtr getNodeset(xmlDocPtr pdoc, const xmlChar *xpath)
{
xmlXPathContextPtr context = NULL; //定义XPath上下文指针
context = xmlXPathNewContext(pdoc);//用xml文档指针来初始化context指针
xmlXPathObjectPtr result = NULL; //定义XPath结果指针
if (pdoc == NULL)
{
printf("pdoc is NULL\n");
return NULL;
}
if (xpath)
{
if (context == NULL)
{
printf("context is NULL\n");
return NULL;
}
result = xmlXPathEvalExpression(xpath, context);//计算xpath的查询结果,并存入result中
if (result == NULL)
{
printf("xmlXPathEvalExpression return NULL\n");
return NULL;
}
if (xmlXPathNodeSetIsEmpty(result->nodesetval))
//使用result->nodesetval得到节点集合指针,其中包含了所有符合Xpath查询结果的节点
{
xmlXPathFreeObject(result);//使用释放Xpath对象指针;
printf("nodeset is empty\n");
return NULL;
}
}
return result;
}
int main(int argc, char **argv)
{
struct timeval t1,t2,diff;
gettimeofday(&t1,0);
xmlDocPtr pdoc = NULL;//文档指针
xmlNodePtr proot = NULL;