首页 文章

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

提问于
浏览
2

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

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

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

Update: 为了更清楚,我提到的第三方库实际上只是一个围绕libxml2解析器的Objective-C包装器,它使用任何XPath查询的结果构建由Foundation类构成的DOM树 . 查询本身是在已经解析的文档(xmlDocPtr)上执行的,该文档被重用于所有查询,所以是的,正如许多答案所说,文档已经是DOM _910579的孩子,但我想可能有一种简单的方法来检索节点与查询的属性 .

4 回答

  • 1

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

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

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

  • 5

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

  • 0

    使用@来获取属性,例如:

    • /parentnode/node1/@a - 将获取"b"值

    • /parentnode/node1/@b - 将获取"c"值

  • 0

    好吧,如果整个事情已经是DOM了,那么你就不会通过XPATH选择node1进行进一步的DOMing了 . 此时,node1有子节点的事实与性能无关 .

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

相关问题