使用XPATH查找xml文档节点

37 篇文章 3 订阅
简而言之,XPATH之于 xml,好比SQL之于关系数据库。要在一个复杂的xml文档中查找所需的信息,XPATH简直是必不可少的工具。XPATH语法简单易学,并且有一个很好的官方教程,见http://www.zvon.org/xxl/XPathTutorial/Output_chi/introduction.html。这个站点的XML各种教程齐全,并且有包括中文在内的各国语言版本,真是让我喜欢到非常!

使用XPATH之前,必须首先熟悉几个数据类型和函数,它们是使用XPATH的前提。在libxml2中使用Xpath是非常简单的,其流程如下:
l         定义一个XPATH上下文指针xmlXPathContextPtr context,并且使用xmlXPathNewContext函数来初始化这个指针;
l         定义一个XPATH对象指针xmlXPathObjectPtr result,并且使用xmlXPathEvalExpression函数来计算Xpath表达式,得到查询结果,将结果存入对象指针中;
l         使用result->nodesetval得到节点集合指针,其中包含了所有符合Xpath查询结果的节点;
l         使用xmlXPathFreeContext释放上下文指针;
l         使用xmlXPathFreeObject释放Xpath对象指针;

具体的使用方法可以看XpathForXmlFile.cpp的这一段代码,其功能是查找符合某个Xpath语句的对象指针:

  1. xmlXPathObjectPtr getNodeSet(xmlDocPtr doc, const xmlChar *szXpath)  
  2. {
  3.     xmlXPathContextPtr context;    //XPATH上下文指针  
  4.     xmlXPathObjectPtr result;       //XPATH对象指针,用来存储查询结果  
  5.     context = xmlXPathNewContext(doc);     //创建一个XPath上下文指针  
  6.     if (context == NULL)  
  7.     {    
  8.        printf("context is NULL"n");  
  9.        return NULL;  
  10.     }  
  11.     result = xmlXPathEvalExpression(szXpath, context); //查询XPath表达式,得到一个查询结果  
  12.     xmlXPathFreeContext(context);             //释放上下文指针  
  13.     if (result == NULL)  
  14.     {  
  15.        printf("xmlXPathEvalExpression return NULL"n");  
  16.        return NULL;   
  17.     }  
  18.     if (xmlXPathNodeSetIsEmpty(result->nodesetval))   //检查查询结果是否为空  
  19.     {  
  20.        xmlXPathFreeObject(result);  
  21.        printf("nodeset is empty"n");  
  22.        return NULL;  
  23.     }  
  24.     return result;     

一个完整的使用Xpath的例子在代码XpathForXmlFile.cpp中,它查找一个xml文件中符合"/root/node2[@attribute='yes']"语句的结果,并且将找到的节点的属性和内容打印出来。编译链接命令如下:
nmake TARGET_NAME=XpathForXmlFile
执行方式如下:
XpathForXmlFile.exe CreatedXml.xml
观察结果可以看出找到了一个节点,即root下面node2节点,它的attribute属性值正好等于yes。更多关于Xpath的内容可以参考XPATH官方手册。只有掌握了XPATH,才掌握了使用大型XML文件的方法,否则每寻找一个节点都要从根节点找起,会把人累死。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值