XPath bookstore/book[1]
выбирает первый узел книги под bookstore
.
Как я могу выбрать первый узел, который соответствует более сложному условию, например, первый узел, который соответствует /bookstore/book[@location='US']
Использование:
(/bookstore/book[@location='US'])[1]
Сначала будут получены элементы книги с атрибутом местоположения, равным «США». Затем он выберет первый узел из этого набора. Обратите внимание на использование скобок, которые требуются в некоторых реализациях.
Обратите внимание, что это не то же самое, что /bookstore/book[1][@location='US']
если первый элемент также не имеет этого атрибута местоположения.
/bookstore/book[@location='US'][1]
не возвращает все книги из США. Я проверял это много раз и в разных реализациях xpath./bookstore/book[@location='US'][1]
возвращает первую книгу «США» в книжном магазине. Если есть несколько книжных магазинов, то он вернет первый из каждого. Это то, о чем просил OP (первый узел в книжном магазине). Ваша версия возвращает только одну книгу из всех книжных магазинов (первое совпадение)./bookstore/book[@location='US'][1]
работает только с простой структурой.Добавьте немного больше структуры и вещи ломаются.
С участием
/bookstore/category/book[@location='US'][1]
доходностьне «первый узел, который соответствует более сложному условию».
/bookstore/category/book[@location='US'][2]
ничего не возвращаетС помощью скобок вы можете получить результат, для которого был задан исходный вопрос:
(/bookstore/category/book[@location='US'])[1]
даети
(/bookstore/category/book[@location='US'])[2]
работает как положено.источник
/bookstore/book[1]
и НЕ(/bookstore/book)[1]
. Предоставленный вами случай отличается от того, о котором просили. Предположительно, ОП принял мой ответ, так как он сделал то, что ожидал (и попросил).'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. В случае совпадения множества узловname
.Как объяснение ответа Джонатана Фингланда:
[position()=1 and @location='US']
) должны быть истинными в целом[position()=1][@location='US']
) должны быть истинными одно за другим[position()=1][@location='US']
! =[@location='US'][position()=1]
while
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
может быть сокращен до[1]
Вы можете строить сложные выражения в предикатах с логическими операторами «
and
» и «or
», а также с функциями Логического XPathnot()
,true()
иfalse()
. Кроме того, вы можете заключить подвыражения в скобки.источник
Самый простой способ найти первый английский узел книги (во всем документе), принимая во внимание более сложный структурированный XML-файл, например:
такое выражение xpath:
источник
Так, учитывая вышеизложенное; Вы можете выбрать первую книгу с
И это найдет первое, где есть США. [A1]
Вернул бы узел, установленный со всеми книгами с местоположением US. [А1, В1, С2]
Вернет первое местоположение книги США, которое существует в категории в любом месте документа. [В1]
вернет первую книгу с местоположением US, которое существует в любом месте под книжным магазином корневого элемента; делая часть книжного магазина избыточной. [A1]
В прямой ответ:
Вернет вам первый узел для элемента книги с местоположением US, которое находится в книжном магазине [A1]
Кстати, если вы хотите, в этом примере найти первую книгу из США, которая не была прямым потомком книжного магазина:
источник
Используйте индекс, чтобы получить желаемый узел, если xpath сложный или имеется более одного узла с одинаковым xpath.
Пример:
Вы можете дать номер, какой узел вы хотите.
источник
если в данном xml предусмотрено пространство имен, лучше использовать это.
источник
например
И
источник
С помощью онлайн- тестера xpath я пишу этот ответ ...
Для этого:
следующий xpath:
выходы:
Поскольку 1 означает выбор всех элементов td, которые являются первыми дочерними элементами их собственного прямого родителя.
Но следующий xpath:
выходы:
источник