33

我相信这应该能够在不参考实现的情况下仅使用标准 XPath 来回答,但仅供参考,我正在使用 .Net(System.Xml 命名空间)中的 XML DOM 对象。

我有一个节点从 XML 文档的深处传递给我的函数,并且我想选择该节点的所有具有特定名称的后代元素,而不管这些节点的中间路径如何。我正在拨打的电话如下所示:

node.SelectNodes("some XPath here");

我正在使用的节点看起来像这样:

...
<food>
  <tart>
    <apple color="yellow"/>
  </tart>
  <pie>
    <crust quality="flaky"/>
    <filling>
      <apple color="red"/>
    </filling>
  </pie>
  <apple color="green"/>
</food>
...

我想要的是所有“苹果”节点的列表,即 3 个结果。我尝试了几种不同的方法,但没有一个能得到我想要的。

node.SelectNodes("apple");

这给了我一个结果,青苹果。

node.SelectNodes("*/apple");

这给了我一个结果,黄色苹果。

node.SelectNodes("//apple");

这给了我数百个结果,看起来像文档中的每个苹果节点,或者至少可能是文档根目录的直接子节点的每个苹果节点。

如何创建一个 XPath,它将为我提供当前节点下的所有苹果节点,而不管它们在当前节点下的深度如何?具体来说,根据我上面的例子,我应该得到三个结果——红色、绿色和黄色的苹果。

4

1 回答 1

47

试试.//apple。这列出了apple作为当前节点的后代的所有节点。为了更好地理解本主题,您应该了解 XPath 轴的工作原理。例如,你也可以写descendant::apple

于 2013-02-25T22:21:51.717 回答