通过libxml2的xpath解析xml
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相关推荐
- java xpath 解析xml_使用XPATH解析XML文件
使用XPATH解析XML文件 import java.util.Iterator; import java.util.List; import org.dom4j.Document; import o ...
- java使用xpath解析xml,java如何使用xpath解析xml
java如何使用xpath解析xml 发布时间:2020-12-08 12:28:00 来源:亿速云 阅读:60 作者:小新 这篇文章给大家分享的是有关java如何使用xpath解析xml的内容.小编 ...
- XPATH解析xml文件
XPATH解析xml文件 一.什么是XPATH 访问路径有 查找本地xml文件 2.解析网上xml文件 一.什么是XPATH 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中 ...
- 利用lxml的xpath解析XML
文章目录 lxml.etree._Element方法及属性 方法 属性 lxml.etree.ElementTree方法及属性 方法 Element类 XPATH lxml是python的一个解析库, ...
- android xpath解析xml,Android 中处理 XML 的四种方式-DOM
Android 中处理 XML 的几种方式连载中,我们就不介绍合成 XML 了,因为合成 XML 可以直接拼接字符串,虽然看起很不高大上,但却很有效.我们主要介绍如何取 XML 中的值. 适用 DOM ...
- JDOM/XPath解析XML简单示例
引用文章出处:https://www.ibm.com/developerworks/cn/xml/x-jdom/ 简单介绍: XPATH遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看 ...
- python3 xpath_Python 3中用XPath解析XML
我有以下xml: Biscuits Wrapped Finished Biscuits Biscuits (Wrapped) Biscuits Sweet Finished Biscuits Bisc ...
- XPath解析xml文件、html文件
直接贴代码 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); //建立docum ...
- 解析html生成xpath,html使用xpath解析xml
test.xml: Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 XQuer ...
- 用Python解析XML的几种常见方法的介绍
这篇文章主要介绍了用Python解析XML的几种常见方法,包括快速的使用ElementTree模块等方法的实例介绍,需要的朋友可以参考下 一.简介 XML(eXtensible Markup Lang ...
最新文章
- android 反编译_Box 黑科技——支持手机端反编译
- golang float string int 相互转换 保留小数位
- NOI2002 贪吃的九头龙
- 51nod 1049 最大子段和
- 找自己的问题和找别人的问题联系和区别
- 随机变量X与随机变量函数Y=g(X)的概率分布
- android+5.0+小米手环,小米手环5和荣耀手环6哪个好-参数对比
- java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
- 实现高性能稳定的socket tcp通讯经验分享
- 算法总结之 生成窗口的最大值数组
- python--几种标准输出(stdout)重定向方式
- 发那科机器人圆弧指令怎么用_发那科机器人PR指令
- Jmeter性能测试之命令行执行和生成测试报告
- linux syn_recv过多ip,SYN_RECV处理方案
- mosquitto1.6.2 Error: A TLS error occurred.(解决)
- 上微信怎么同时用计算机,电脑端微信双开,教你两种简单的方法,上手即用!...
- 包装成悲伤消费的骗局正在收割午夜的年轻人
- 深入Spring底层透析Bean创建过程之拨云见日篇
- vue和elementui是什么关系
- PHP explode() 函数与implode() 函数