XPath:选择一个节点而不提取其子节点

时间:2011-05-18 17:36:20

标签: xml xpath

如何在不检索其所有子节点的情况下使用XPath选择节点?例如,在以下XML文档中:

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

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

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

4 个答案:

答案 0 :(得分:5)

像/ a / b / c这样的XPath表达式将选择c元素:它不会选择它们的子元素。许多人想象它也选择孩子的原因是很多工具会通过显示以c元素为根的整个子树来显示XPath表达式的结果。人们可以理解为什么他们这样做 - 它以视觉方式向您显示您所选择的内容 - 但XPath表达式本身只是返回一个指向所选元素的指针,而您从那里开始完全取决于您。 (有些工具,而不是向您显示以元素为根的子树,显示节点及其所有祖先的路径 - 这同样有效。)

答案 1 :(得分:1)

如果您只想要属性,那么只需选择属性:/ parentnode / node1 / @ *

但是(如另一个答案所述)和Xpath处理器仍然需要解析整个文件。 你不会节省太多。

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

答案 2 :(得分:0)

好吧,如果整个事情已经是DOM了,那么你就不会通过XPATH选择node1来进行更多的DOM。那时node1有子女的事实与性能无关。

然而,如果我们假设整个事情不是DOM'd那么我们可能会谈论一个只有前瞻性的读者。有一些只有前瞻性的读者可以做你需要的XPATH。

答案 3 :(得分:0)

使用@获取属性,例如:

  • / parentnode / node1 / @ a - 将获取“b”值
  • / parentnode / node1 / @ b - 将获取“c”值