使用XPATH查找xml文档节点

来源:互联网 发布:网络小说 毒 知乎 编辑:程序博客网 时间:2024/06/06 13:24
简而言之,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语句的对象指针:

xmlXPathObjectPtr getNodeSet(xmlDocPtr doc, const xmlChar *szXpath){    xmlXPathContextPtr context;    //XPATH上下文指针    xmlXPathObjectPtr result;       //XPATH对象指针,用来存储查询结果    context = xmlXPathNewContext(doc);     //创建一个XPath上下文指针    if (context == NULL)    {         printf("context is NULL"n");       return NULL;    }    result = xmlXPathEvalExpression(szXpath, context); //查询XPath表达式,得到一个查询结果    xmlXPathFreeContext(context);             //释放上下文指针    if (result == NULL)    {       printf("xmlXPathEvalExpression return NULL"n");       return NULL;     }    if (xmlXPathNodeSetIsEmpty(result->nodesetval))   //检查查询结果是否为空    {       xmlXPathFreeObject(result);       printf("nodeset is empty"n");       return NULL;    }    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文件的方法,否则每寻找一个节点都要从根节点找起,会把人累死。