Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XPath:选择节点而不获取其子节点_Xml_Xpath - Fatal编程技术网

Xml XPath:选择节点而不获取其子节点

Xml XPath:选择节点而不获取其子节点,xml,xpath,Xml,Xpath,如何使用XPath选择节点而不检索其所有子节点?例如,在以下XML文档中: <parentnode> <node1 a="b" b="c"> <child1/> <child2/> ... many many child nodes <childN/> </node1> <node2/> </parentnode> ... 多个子节点 我希望能够选择“

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

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

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


<强>更新:,为了更清楚,我提到的第三方库实际上只是LIXXML2解析器的一个Objul-C包装器,它用任何XPath查询的结果来构建由基础类构成的DOM树。查询本身是在一个已经解析的文档(xmlDocPtr)上执行的,该文档被重用用于所有查询,因此,正如许多答案所说,文档已经在C级进行了DOM'ed,但是Objective-C包装器实现在这个特定场景中会产生性能影响。我可以修改这个库来选择性地不获取所选节点的子节点,但我认为可能有一种简单的方法可以通过查询仅检索节点的属性。

好吧,如果整个过程已经完成,那么您就不需要通过XPATH选择节点1来做进一步的扩展。在这一点上,节点1有子节点的事实与性能无关


然而,如果我们假设整件事都没有完成,那么我们很可能在谈论一个只转发的阅读器。有一些仅转发的读卡器可以执行您需要的xpath操作。

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

但是(如另一个答案所述),Xpath处理器仍然必须解析整个文件。 你不会省很多钱


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

使用@获取属性,例如:

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

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

谢谢,这正是我只检索属性所需要的。我已经在问题中进一步澄清了性能冲击来自何方。事实上,你是非常正确的。第三方库正在构建自己的DOM树,其根位于选定节点。我最初没有正确解释,后来更新了这个问题。谢谢