Подтвердить что ты не робот

XPath для выбора всех элементов с указанным именем

Я считаю, что на этот вопрос можно ответить только с использованием стандартного XPath без ссылки на реализацию, но только для справки Я использую объекты XML DOM в пространстве имен .Net(System.Xml).

У меня есть node, переданный моей функции, откуда-то глубоко внутри XML-документа, и я хочу выбрать все элементы-потомки этого node, которые имеют определенное имя, независимо от промежуточного пути к этим узлам. Вызов, который я делаю, выглядит следующим образом:

node.SelectNodes("some XPath here");

node Я работаю с выглядит примерно так:

...
<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");

Это дает мне сотни результатов, выглядит как каждое яблоко node в документе или, по крайней мере, может быть каждое яблоко node, являющееся прямым потомком корня документа.

Как создать XPath, который даст мне все узлы apple под моим текущим node, независимо от того, насколько глубоко он находится под текущим node? В частности, исходя из моего примера выше, я должен получить три результата - красные, зеленые и желтые яблоки.

4b9b3361

Ответ 1

Попробуйте .//apple. В нем перечислены все узлы apple, которые являются потомками текущего node. Чтобы лучше понять эту тему, вы должны узнать, как работают оси XPath. Вы также можете написать descendant::apple, например.