Как вы можете идентифицировать несколько элементов с одним и тем же именем в XPath? - PullRequest
9 голосов
/ 26 ноября 2008

Что если бы у меня был документ с несколькими элементами с одинаковым именем - как мне получить, например, второй элемент?

<doc>
...
 <element name="same">foo</element>
...
 <element name="same">bar</element>
...
 <element name="same">baz</element>
...
</doc>

Я бы ожидал, что что-то вроде // elem [@ name = 'same'] [2] будет работать.

Кроме того, как мне найти второй из последних элементов в xpath с переменным количеством элементов с одинаковым именем

1 Ответ

20 голосов
/ 26 ноября 2008

[ ] имеет более высокий приоритет, чем // (а "//" на самом деле является только сокращением, а не оператором). Это так, потому что согласно XPath 1.0 Spec ,

"// - это сокращение от / потомок-или-себя :: node () /"

и позже:

" ПРИМЕЧАНИЕ : путь местоположения // para 1 не означает то же самое, что путь местоположения / потомок :: para 1 . Последний выбирает первый элемент-потомок para; первый выбирает все элементы-потомки para, которые являются первыми para-потомками своих родителей. "

Следовательно, выражение XPath:

//element[@name='same'][2]

означает:

Выберите любой элемент в документе с именем «element», имеющий атрибут «name» со значением «same», и этот элемент является вторым таким потомком своего родителя.

То, что вы хотите, это :

(//element[@name='same'])[2]

Обратите внимание на скобки, которые переопределяют более высокий приоритет [].

Аналогично, последний, но один такой узел выбирается следующим выражением XPath:

(//element[@name='same'])[last()-1]

Наконец, необходимое предупреждение : Использование аббревиатуры "//" очень дорого, так как оно вызывает обход всего (под) дерева. Когда структура документа известна, рекомендуется использовать более конкретные конструкции (пути расположения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...