XPath bookstore/book[1]
wybiera pierwszy węzeł książki pod bookstore
.
Jak mogę wybrać pierwszy węzeł, który pasuje do bardziej skomplikowanego warunku, np. Pierwszy, który pasuje /bookstore/book[@location='US']
Posługiwać się:
(/bookstore/book[@location='US'])[1]
Najpierw otrzyma elementy książki z atrybutem położenia równym „US”. Następnie wybierze pierwszy węzeł z tego zestawu. Zwróć uwagę na użycie nawiasów, które są wymagane przez niektóre implementacje.
Uwaga: nie jest to to samo, o /bookstore/book[1][@location='US']
ile pierwszy element również nie ma tego atrybutu położenia.
/bookstore/book[@location='US'][1]
nie zwraca wszystkich książek z „US”. Testowałem to wielokrotnie i pod różnymi implementacjami xpath w różnych językach./bookstore/book[@location='US'][1]
zwraca pierwszą książkę „US” pod księgarnią. Jeśli istnieją różne księgarnie, zwróci pierwszą z każdej. O to poprosił OP (pierwszy węzeł w księgarni). Twoja wersja zwraca tylko jedną książkę ze wszystkich księgarń (pierwszy mecz)./bookstore/book[@location='US'][1]
działa tylko z prostą strukturą.Dodaj trochę więcej struktury i rzeczy się psują.
Z
/bookstore/category/book[@location='US'][1]
dajenie „pierwszy węzeł, który pasuje do bardziej skomplikowanego warunku”.
/bookstore/category/book[@location='US'][2]
nic nie zwraca.Za pomocą nawiasów można uzyskać wynik pierwotnego pytania:
(/bookstore/category/book[@location='US'])[1]
dajei
(/bookstore/category/book[@location='US'])[2]
działa zgodnie z oczekiwaniami.źródło
/bookstore/book[1]
i NIE(/bookstore/book)[1]
. Podany przez Ciebie przypadek nie jest taki sam jak ten, o który prosiłeś PO. Przypuszczalnie OP zaakceptował moją odpowiedź, ponieważ spełnił oczekiwania (i poprosił).'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. W przypadku wielu dopasowań węzłówname
.Jako wyjaśnienie odpowiedzi Jonathana Finglanda:
[position()=1 and @location='US']
) musi być spełnionych jako całość[position()=1][@location='US']
) musi być spełnionych jeden po drugim[position()=1][@location='US']
! =[@location='US'][position()=1]
while
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
można skrócić[1]
Możesz budować złożone wyrażenia w predykatach za pomocą operatorów boolowskich „
and
” i „or
” oraz funkcji boolowskich XPathnot()
,true()
ifalse()
. Dodatkowo możesz zawijać wyrażenia w nawiasach.źródło
Najłatwiejszy sposób na znalezienie pierwszego angielskiego węzła książki (w całym dokumencie), biorąc pod uwagę bardziej skomplikowany plik XML, taki jak:
to wyrażenie xpath:
źródło
Biorąc pod uwagę powyższe; możesz wybrać pierwszą książkę za pomocą
I to znajdzie pierwszy gdziekolwiek, który ma lokalizację USA. [A1]
Zwróci zestaw węzłów ze wszystkimi książkami o lokalizacji US. [A1, B1, C2]
Zwraca pierwszą lokalizację książki US, która istnieje w kategorii w dowolnym miejscu w dokumencie. [B1]
zwróci pierwszą książkę z lokalizacją US, która istnieje w dowolnym miejscu pod księgarnią elementu głównego; sprawiając, że część / bookstore stała się zbędna. [A1]
W bezpośredniej odpowiedzi:
Zwróci ci pierwszy węzeł dla elementu książki z lokalizacją US, która jest pod księgarnią [A1]
Nawiasem mówiąc, jeśli chcesz, w tym przykładzie znajdź pierwszą amerykańską książkę, która nie była bezpośrednim dzieckiem księgarni:
źródło
Użyj indeksu, aby uzyskać żądany węzeł, jeśli xpath jest skomplikowany lub więcej niż jeden węzeł ma tę samą ścieżkę xpath.
Np .:
Możesz podać numer żądanego węzła.
źródło
jeśli przestrzeń nazw jest podana na danym xml, lepiej tego użyć.
źródło
na przykład
I
źródło
Przy pomocy internetowego testera xpath piszę tę odpowiedź ...
W tym celu:
następujący xpath:
wyjścia:
Ponieważ 1 oznacza wybierz wszystkie elementy td , które są pierwszym dzieckiem własnego bezpośredniego rodzica.
Ale następujący xpath:
wyjścia:
źródło