2011-05-18 104 views
2

如何使用XPath选择节点而不检索其所有子节点?例如,下面的XML文档中:XPath:选择一个节点,但不取回其子节点

<parentnode> 
    <node1 a="b" b="c"> 
    <child1/> 
    <child2/> 
    ... many many child nodes 
    <childN/> 
    </node1> 
    <node2/> 
</parentnode> 

我希望能够以选择“节点1”元素,以检查其属性,但没有选择的子节点,这我不需要解析并可能是成千上万的元素,从而影响查询的性能(其输出用于在第三方库中构建一种包含数组和字典的DOM树)。

更新:只是更清晰,我提到的第三方库实际上只是一个围绕的libxml2解析器建立与任何XPath查询的结果却让基础类的DOM树Objective-C的包装。查询本身是通过一个已经被解析过的文档(xmlDocPtr)来执行的,这个文档被所有的查询重用,所以是的,尽可能多的答案说,这个文档已经在C级DOM了,但是Objective-C包装实现产生了性能在这种特殊情况下击中。我可以修改这个库来选择性地不选取所选节点的子节点,但我认为可能有一个简单的方法来检索节点的查询属性。

回答

1

如果你只是想的属性,那么就选择属性:/ parentnode /节点1/@ *

但(作为另一个答案说明)和XPath处理器仍然需要分析整个文件。 你不会节省太多。

如果您只想解析文件的一部分,然后在获取所需信息后停止,则应该使用SAX或其他一些API,以便您可以对解析进行较低级别的控制。

+0

谢谢,这正是我需要检索的属性。在性能问题来自何处的问题中,我进一步阐明了这一点。 – 2011-05-19 09:53:31

0

那么,如果整个事情已经DOM'd了,那么你没有进一步通过选择node1 XPATH的DOM。那时node1有孩子的事实与性能无关。

但是,如果我们假设整个事物不是DOM,那么我们可能只是谈论一个只读的阅读器。有一些只能向前阅读的读者可以完成您需要的XPATH。

0

使用@获得的属性,例如:

  • /parentnode /节点1/@一个 - 将获取的 “b” 值
  • /parentnode /节点1/@ b - 会取“c”值
5

像/ a/b/c这样的XPath表达式将选择c元素:它不会选择子元素。许多人认为它也会选择孩子的原因是,许多工具都会显示XPath表达式的结果,方法是显示以c元素为根的整个子树。人们可以理解他们为什么这么做 - 它会直观地向您显示您选择的内容 - 但XPath表达式本身只是返回指向所选元素的指针,而您从哪里去完全取决于您。 (有些工具,而不是向你显示以该元素为根的子树,显示了具有其所有祖先的节点的路径 - 这同样有效。)

+0

事实上,你是非常正确的。它是第三方库,它正在构建自己的DOM树,该树以选定节点为根。我最初没有正确解释它,并从那以后更新了这个问题。谢谢。 – 2011-05-19 09:57:11