如何在不检索其所有子节点的情况下使用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 回答
如果您只想要属性,那么只需选择属性:/ parentnode / node1 / @ *
但是(如另一个答案中所述)和Xpath处理器仍然需要解析整个文件 . 你不会节省太多 .
如果您只想解析部分文件,然后在获得所需信息后停止,则应该使用SAX或其他一些API来提供较低级别的解析控制 .
像/ a / b / c这样的XPath表达式将选择c元素:它不会选择它们的子元素 . 许多人想象它也选择孩子的原因是很多工具会通过显示以c元素为根的整个子树来显示XPath表达式的结果 . 人们可以理解为什么他们这样做 - 它以视觉方式向您显示您所选择的内容 - 但XPath表达式本身只是返回指向所选元素的指针,而您从那里开始完全取决于您 . (有些工具,而不是向您显示以元素为根的子树,显示具有其所有祖先的节点的路径 - 这同样有效 . )
使用@来获取属性,例如:
/parentnode/node1/@a - 将获取"b"值
/parentnode/node1/@b - 将获取"c"值
好吧,如果整个事情已经是DOM了,那么你就不会通过XPATH选择node1进行进一步的DOMing了 . 此时,node1有子节点的事实与性能无关 .
但是,如果我们假设整个事情不是DOM'd那么我们可能会谈论一个只有前瞻性的读者 . 有一些只有前瞻性的读者可以做你需要的XPATHing .