Xpath简介

XPath 是一门在 XML 文档中查找信息的语言, 基于XML的树状结构,提供在数据结构树中找寻节点的能力,用于在 XML 文档中通过元素和属性进行导航。XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

xpath表达式的基本格式

xpath通过"路径表达式"(Path Expression)来选择节点。在形式上,"路径表达式"与传统的文件系统非常类似。

斜杠(/)作为路径内部的分割符。

同一个节点有绝对路径和相对路径两种写法。

绝对路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...。

相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首。

"."表示当前节点。

".."表示当前节点的父节点

nodename(节点名称):表示选择该节点的所有子节点

"/":表示选择根节点

"//":表示选择任意位置的某个节点

"@": 表示选择某个属性

xpath路径表达式可以参考https://www.cnblogs.com/sunny-bear/articles/5400441.html

使用Xpath常用到的函数

(1)xmlXPathNewContext函数

xmlXPathContextPtr  xmlXPathNewContext(xmlDocPtr doc)

创建一个新的上下文指针,释放时调用xmlXPathFreeContext

参数doc:    XML文档指针

返回:新的上下文指针

(2)xmlXPathRegisterNs函数

int xmlXPathRegisterNs(xmlXPathContextPtr ctxt,const xmlChar * prefix,const xmlChar * ns_uri)

注册新的命名空间。如果@ns_uri为NULL,则取消注册命名空间

ctxt:      XPath上下文

prefix:  命名空间前缀不能为NULL或空字符串

ns_uri:  命名空间名称

返回:    成功时为0,出错时为-1

(3)xmlXPathEvalExpression函数

xmlXPathObjectPtr      xmlXPathEvalExpression(const xmlChar * str,xmlXPathContextPtr ctxt)

xmlXPathEval()的别名。在给定的上下文和XPath位置路径中找到符合要求的元素。

参数str:      XPath表达式

参数ctxt:     XPath上下文

返回:    查询结果指针。

解析xml的方法和实例

通过libxml2对xml进行解析的方法有两种,一种是比较简单的使用libxml2提供的接口来对xml一层一层的解析,缺点是层数嵌套比较多时效率不好。另一种方法是使用xpath,通过你给出路径,它可以快速的查找出目标节点。

那么下面来看看两种方法有什么不同。

第一种,递归调用接口一层一层的查找所要找的节点。

xmlNodePtr getXmlNodeByName(xmlNodePtr root,char *name)//通过节点名找到对应节点{if(NULL ==root || NULL ==name){return NULL;}xmlNodePtr pnode=xmlFirstElementChild(root);//返回根节点的子节点while(pnode!=NULL){if(!strcmp(pnode->name,name))return pnode;xmlNodePtr pnode_1 = getXmlNodeByName(pnode,name);//递归查找下一层if(pnode_1!=NULL)return pnode_1;pnode = xmlNextElementSibling(pnode);//返回同一层的节点}return NULL;}

调用方法:

cur = getXmlNodeByName(root,"Object");//从root中找到名字为Object的节点

第二种,通过路径直接找出所要查找的节点。

xmlXPathObjectPtr getNodeset(xmlDocPtr pdoc, const xmlChar *xpath){if(pdoc == NULL|| xpath == NULL)return NULL;xmlXPathContextPtr context = NULL; //定义XPath上下文指针xmlXPathObjectPtr result = NULL; //定义XPath结果指针context = xmlXPathNewContext(pdoc);//用xml文档指针来初始化context指针if(context!=NULL){result = xmlXPathEvalExpression(xpath, context);//计算xpath的查询结果,//并存入result中if(result == NULL)return NULL;if (xmlXPathNodeSetIsEmpty(result->nodesetval))//使用result->nodesetval得到节点集合指针,其中包含了所有符合Xpath查询结果的节点{xmlXPathFreeObject(result);//使用释放Xpath对象指针;printf("nodeset is empty\n");return NULL;}}return NULL;}

调用方法:

char tmpxpath[128];sprintf(tmpxpath,"///AnalyticsModule[@Type='Face_Search_Engine']//SimpleItem[@Name='fastpicnum']",valuestring);xmlXPathObjectPtr tmpxPathObj_ptr = getNodeset(RuleDoc,tmpxpath);//返回查询结果if((tmpxPathObj_ptr)&&(tmpxPathObj_ptr->nodesetval))//判断查询结果和节点集合指针是否为空{tmpxNode = tmpxPathObj_ptr->nodesetval->nodeTab[0];······//处理}

以上tmpxpath表示的路径含义是在根目录下任意位置找到AnalyticsModule且其属性Type='Face_Search_Engine’,然后在从AnalyticsModule下任意位置找到属性为Name='fastpicnum'的tt:SimpleItem。

查询到的节点会放到查询节点集合指针中,例如本例子中给的路径比较明确,只有一个,则一般都是节点集合的第一个元素,如果想找出某个路径下的全部子元素,可以使用下面的例子

xmlChar *xpath = BAD_CAST ("/producttype/product/*"); //xpath语句,路径为product的所有子元素xmlXPathObjectPtr result = getNodeset(pdoc, xpath); //调用函数,查询XPath表达式,得到一个查询结果int i;for (i = 0; i < result ->nodeNr; i++){tmpxNode = result ->nodeTab[i];//遍历······//处理}

更多libxml2接口可以参考libxml2官网

通过libxml2的xpath解析xml相关推荐

  1. java xpath 解析xml_使用XPATH解析XML文件

    使用XPATH解析XML文件 import java.util.Iterator; import java.util.List; import org.dom4j.Document; import o ...

  2. java使用xpath解析xml,java如何使用xpath解析xml

    java如何使用xpath解析xml 发布时间:2020-12-08 12:28:00 来源:亿速云 阅读:60 作者:小新 这篇文章给大家分享的是有关java如何使用xpath解析xml的内容.小编 ...

  3. XPATH解析xml文件

    XPATH解析xml文件 一.什么是XPATH 访问路径有 查找本地xml文件 2.解析网上xml文件 一.什么是XPATH 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中 ...

  4. 利用lxml的xpath解析XML

    文章目录 lxml.etree._Element方法及属性 方法 属性 lxml.etree.ElementTree方法及属性 方法 Element类 XPATH lxml是python的一个解析库, ...

  5. android xpath解析xml,Android 中处理 XML 的四种方式-DOM

    Android 中处理 XML 的几种方式连载中,我们就不介绍合成 XML 了,因为合成 XML 可以直接拼接字符串,虽然看起很不高大上,但却很有效.我们主要介绍如何取 XML 中的值. 适用 DOM ...

  6. JDOM/XPath解析XML简单示例

    引用文章出处:https://www.ibm.com/developerworks/cn/xml/x-jdom/ 简单介绍: XPATH遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看 ...

  7. python3 xpath_Python 3中用XPath解析XML

    我有以下xml: Biscuits Wrapped Finished Biscuits Biscuits (Wrapped) Biscuits Sweet Finished Biscuits Bisc ...

  8. XPath解析xml文件、html文件

    直接贴代码 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); //建立docum ...

  9. 解析html生成xpath,html使用xpath解析xml

    test.xml: Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 XQuer ...

  10. 用Python解析XML的几种常见方法的介绍

    这篇文章主要介绍了用Python解析XML的几种常见方法,包括快速的使用ElementTree模块等方法的实例介绍,需要的朋友可以参考下 一.简介 XML(eXtensible Markup Lang ...

最新文章

  1. android 反编译_Box 黑科技——支持手机端反编译
  2. golang float string int 相互转换 保留小数位
  3. NOI2002 贪吃的九头龙
  4. 51nod 1049 最大子段和
  5. 找自己的问题和找别人的问题联系和区别
  6. 随机变量X与随机变量函数Y=g(X)的概率分布
  7. android+5.0+小米手环,小米手环5和荣耀手环6哪个好-参数对比
  8. java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
  9. 实现高性能稳定的socket tcp通讯经验分享
  10. 算法总结之 生成窗口的最大值数组
  11. python--几种标准输出(stdout)重定向方式
  12. 发那科机器人圆弧指令怎么用_发那科机器人PR指令
  13. Jmeter性能测试之命令行执行和生成测试报告
  14. linux syn_recv过多ip,SYN_RECV处理方案
  15. mosquitto1.6.2 Error: A TLS error occurred.(解决)
  16. 上微信怎么同时用计算机,电脑端微信双开,教你两种简单的方法,上手即用!...
  17. 包装成悲伤消费的骗局正在收割午夜的年轻人
  18. 深入Spring底层透析Bean创建过程之拨云见日篇
  19. vue和elementui是什么关系
  20. PHP explode() 函数与implode() 函数

热门文章

  1. 基于最小二乘法的人口增长模型拟合
  2. 数字信号处理基础知识
  3. Opencv获取DroidCamx视频流并改变分辨率
  4. xp系统整个计算机非常慢,xp系统电脑运行慢太卡了怎么办|xp系统运行卡顿的解决方法...
  5. 《黑客X档案》2006年-2012年全集(PDF格式)
  6. linux启动报错23修复
  7. Cisco思科模拟器不限速下载安装 bp网盘教程
  8. ueditor清除多余空行
  9. 后端游戏引擎调研-2021.07
  10. 如何使用Ubuntu安装QQ音乐Linux版本