使用Xpath查找属性的祖先

时间:2012-10-23 16:45:17

标签: xpath libxml2

<?xml>
<env>
<body>
<folderxml>
<folder id='1'>
 <folder id='2' name ='document'>
   <folder id='3' name ='Music'>
     <folder id= '4' name= 'album' xlink='true'>
     </folder>
   </folder>
</folder>
</folder>
</folderxml>
</body>
</env>

如果属性“链接”,我需要路径。是真的。像xpath.evaluate(path if(link = true))之类的东西。结果应该是&#34; / documents / music / album&#34;

1 个答案:

答案 0 :(得分:0)

应用以下XPath表达式(基于XPath tutorial)后:

xmlXPathEval("//*[@xlink='true']", doc)

您获得了节点列表的链接。在示例中,它是folder id的单个节点4。然后你需要编写一个函数来遍历所有父项并连接它们的name属性。

如果您只需要匹配文件夹的名称,则可以使用

xmlXPathEval("string(//*[@xlink='true']/@name)", doc)

并阅读结果的stringval成员。但这只匹配第一个节点。

编辑:至于迭代父母的功能,我想通过xmlNodePtr->parent成员直接访问并使用xmlGetProp读取属性。但是当我看到你的评论(以及问题的标题)时,我认为你可以使用相对的xpath查询,请参阅What's the most efficient way to do recursive XPath queries using libxml2?