Załóżmy, że mam następujący kod XML:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
Chciałbym utworzyć ścieżkę xpath, która zwraca wszystkie węzły książek, które mają węzeł tytułu z atrybutem języka „it”.
Moja próba wyglądała mniej więcej tak:
//book[title[@lang='it']]
Ale to nie zadziałało. Spodziewam się odzyskania węzłów:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
Jakieś wskazówki?
Odpowiedzi:
Próbować
To brzmi:
book
elementytitle
lang
"it"
Może ci się to przydać - jest to artykuł zatytułowany „XPath w pięciu akapitach” autorstwa Ronalda Bourreta.
Ale szczerze mówiąc,
//book[title[@lang='it']]
powyższe powinno być równoważne, chyba że twój silnik XPath ma „problemy”. Więc może to być coś w kodzie lub przykładowym pliku XML, czego nam nie pokazujesz - na przykład Twoja próbka jest fragmentem XML. Czy to możliwe, że element główny ma przestrzeń nazw, a ty nie liczysz tego w zapytaniu? Powiedziałeś nam tylko, że to nie zadziałało, ale nie powiedziałeś nam, jakie wyniki uzyskałeś.źródło
title
nie jest bezpośrednim dzieckiembook
, ale gdzieś głębiej i nie wiemy, gdzie dokładnie?//book[/title/@lang = 'it']
nie wydaje się działać?Wiele lat później, ale użyteczną opcją byłoby użycie osi XPath ( https://www.w3schools.com/xml/xpath_axes.asp ). Mówiąc dokładniej, chcesz użyć osi potomków .
Myślę, że ten przykład załatwi sprawę:
Pozwala to na wybranie wszystkich
book
elementów, które zawierajątitle
element potomny (niezależnie od tego, jak głęboko jest on zagnieżdżony), zawierający wartość atrybutu języka równą „it”.Nie mogę z całą pewnością stwierdzić, czy ta odpowiedź dotyczy roku 2009, ponieważ nie jestem w 100% pewien, czy osie XPath istniały w tamtym czasie. Mogę potwierdzić, że istnieją one dzisiaj i stwierdziłem, że są niezwykle przydatne w nawigacji XPath i jestem pewien, że Ty też.
źródło
jest faktycznie odpowiednikiem
Wypróbowałem to przy użyciu vtd-xml, oba wyrażenia dają ten sam wynik ... jakiego silnika przetwarzania xpath użyłeś? Myślę, że ma to problem ze zgodnością Poniżej znajduje się kod
źródło
Myślę, że twoja własna sugestia jest poprawna, jednak XML nie jest do końca poprawny. Jeśli korzystasz z wersji
//book[title[@lang='it']]
on,<root>[Your"XML"Here]</root>
bezpłatni testerzy xPath online, tacy jak tutaj , znajdą oczekiwany wynik.źródło
Spróbuj użyć tego wyrażenia xPath:
To powinno dać ci wszystkie węzły książek w języku „to”
źródło