类似于libxml2中selectSingleNode的功能?

时间:2016-05-02 11:40:34

标签: c++ libxml2

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
<catalog>

IXMLDOMNode* pnode;
IXMLDOMNode* pNodeAuthor = NULL;
pnode->selectSingleNode (CComBSTR(L"author"), & pNodeAuthor);

OR

getElementsByTagName("book[@id='bk101']") 

OR

selectNodes("//book[@id='bk101']") 

问:在上面的XML文件中,使用Microsoft的XML DOM,我可以通过使用selectSingleNode()或getElementbyTagName()或selectNodes()函数获取任何特定节点,只需传递节点名称即可

我想使用Libxml2做同样的事情,我已经阅读了所有标准函数,但没有得到任何类似的函数,如果你知道任何类似的功能或其他方法那么请帮助!

1 个答案:

答案 0 :(得分:3)

很多时候我不使用libxml2但是......

有更多方法可以做到这一点。一种方法是使用xpath

Here这是一个例子

简而言之,首先,您应该打开并解析xml文件,获取xmlDocPtr xmlParseFile()

xmlDocPtr xmlDoc = xmlParseFile(fileName);

接下来,您应该使用xmlXPathNewContext()

创建xml路径上下文
xmlXPathContextPtr  xPathCnt = xmlXPathNewContext(xmlDoc);

现在您可以找到具有xpath规则的节点;在你的情况下

xmlXPathObjectPtr result = xmlXPathEvalExpression((xmlChar*)"//book[@id=\'bk101\']", xPathCnt);

如果结果不合理,您可以使用

进行检查
xmlXPathNodeSetIsEmpty(result->nodesetval)

您的元素应位于result->nodessetval,其编号应为result->nodessetval->nodeNr

链接示例中的更多详细信息。

p.s。:谨慎,未经过测试的代码

p.s.2:抱歉我的英语不好