Jest to trzecia część z cyklu XPath – Zadania, który ma na celu przetestować Twoją wiedzę z zakresu wyrażeń XPath na różnych przykładach.
Zadania tu zebrane dotyczą głównie nieznanych typów elementów, ale bazują też na wyrażeniach poruszonych w poprzednich częściach. XML, na którym bazują zadania, wraz z aplikacją pozwalającą na testy wyrażeń XPath, dostępny jest pod adresem XPath Playground. Teraz, gdy mamy już wszystkie narzędzia gotowe możemy przystąpić do rozwiązywania zadań…
Zatem do dzieła! 🙂
P.S. Ściąga z wyrażeń XPath dostępna jest na stronie XPath cheat sheet 😉
Zadanie 1 – Nieznane elementy
Znajdź wszystkie tytuły elementów (węzły, ang. nodes), które znajdują się w shelves.
Oczekiwany wynik
Dune,
The Lord of the Rings,
Forrest Gump,
Perfekcyjna Niedoskonałość,
Robot Bob,
The Dark Tower: The Gunslinger,
The Dark Tower II: The Drawing of the Three,
How to program stuff
Podpowiedź
Do znajdowania dowolnego węzła służy operator *.
Rozwiązanie
//shelves/*/title
Zadanie 2 – Nieznane elementy
Znajdź wszystkie elementy (węzły, ang. nodes), które znajdują się w pierwszym elemencie typu book w shelves.
Oczekiwany wynik
Dune,
Frank Herbert,
1965,
45.00
Podpowiedź 1
Do znajdowania dowolnego węzła służy operator *.
Podpowiedź 2
Do znajdowania danego elementu listy służy operator [].
Rozwiązanie
//shelves/book[1]/*
Zadanie 3 – Nieznane elementy
Znajdź pierwszy element (węzły, ang. nodes), który znajduje się w pierwszym elemencie typu book w shelves.
Oczekiwany wynik
Dune
Podpowiedź 1
Do znajdowania dowolnego węzła służy operator *.
Podpowiedź 2
Do znajdowania danego elementu listy służy operator [].
Rozwiązanie
//shelves/book[1]/*[1]
Zadanie 4 – Nieznane atrybuty
Znajdź wartości wszystkich atrybutów, jakie znajdują się w pierwszym elemencie typu book w shelves.
Oczekiwany wynik
sci-fi
Podpowiedź 1
Do znajdowania dowolnego węzła lub atrybutu służy operator *.
Podpowiedź 2
Do znajdowania danego elementu listy służy operator [].
Podpowiedź 3
Do znajdowania wartości atrybutu służy operator @.
Rozwiązanie
//shelves/book[1]/@*
Zadanie 5 – Nieznane atrybuty i predykaty
Znajdź wszystkie elementy typu title, które mają dowolny atrybut równy wartości en.
Oczekiwany wynik
Dune,
The Lord of the Rings,
Forrest Gump,
The Dark Tower: The Gunslinger,
The Dark Tower II: The Drawing of the Three,
How to program stuff,
The Shining,
How to program other stuff,
In the miso soup,
The Wind-Up Bird Chronicle,
How to prepare your garden for Eternal Autumn,
Heavy matter
Podpowiedź 1
Do znajdowania dowolnego węzła lub atrybutu służy operator *.
Podpowiedź 2
Do znajdowania danego elementu listy służy operator [].
Podpowiedź 3
Do znajdowania wartości atrybutu służy operator @.
Rozwiązanie
//title[@*='en']
Zadanie 6 – Nieznane atrybuty i predykaty
Znajdź wszystkie elementy, jakie znajdują się w elemencie typu shelves, które mają dowolny atrybut równy wartości en.
Oczekiwany wynik
Dune,
The Lord of the Rings,
Forrest Gump,
The Dark Tower: The Gunslinger,
The Dark Tower II: The Drawing of the Three,
How to program stuff
Podpowiedź 1
Do znajdowania dowolnego węzła lub atrybutu służy operator *.
Podpowiedź 2
Do znajdowania danego elementu listy służy operator [].
Podpowiedź 3
Do znajdowania wartości atrybutu służy operator @.
Rozwiązanie
//shelves//*[@*='en']
Zadanie 7 – Nieznane elementy i predykaty
Znajdź wszystkie elementy, jakie znajdują się w elemencie typu shelves, które mają wartość title równą Dune.
Oczekiwany wynik
DuneFrank Herbert196545.00
Podpowiedź 1
Do znajdowania dowolnego węzła lub atrybutu służy operator *.
Rozwiązanie
//shelves//*[title='Dune']
Zadanie 8 – Nieznane elementy i predykaty
Znajdź wszystkie elementy, jakie znajdują się w elemencie typu shelves, które mają wartość year większą niż 1990.
Oczekiwany wynik
Perfekcyjna NiedoskonałośćJacek Dukaj200435.00,
Robot BobJacek Doe200015.00,
How to program stuffJohn Doe199110.00
Podpowiedź 1
Do znajdowania dowolnego węzła lub atrybutu służy operator *.
Rozwiązanie
//shelves//*[year > 1990]
3 komentarze
jest jakas roznica pomiedzy ‘//shelves/*/title’ a ‘//shelves//title’
Hej,
Wyrażenie //shelves/*/title zwróci tytuły zawarte w następujących ścieżkach np: //shelves/a/title //shelves/b/title
Natomiast wyrażenie //shelves//title zwróci tytuły zawarte w następujących ścieżkach np: //shelves/a/title //shelves/b/title //shelves/b/c/title //shelves/b/c/d/title
Czyli /*/ pozwoli na “przeskoczenie” jednego dowolnego węzła, natomiast // na przeskoczenie dowolnej liczby węzłów 😉
Pozdrawiam,
jest jakas roznica pomiedzy ‘//shelves/*/title’ a ‘//shelves//title’
Hej,
Wyrażenie
//shelves/*/title
zwróci tytuły zawarte w następujących ścieżkach np://shelves/a/title
//shelves/b/title
Natomiast wyrażenie
//shelves//title
zwróci tytuły zawarte w następujących ścieżkach np://shelves/a/title
//shelves/b/title
//shelves/b/c/title
//shelves/b/c/d/title
Czyli
/*/
pozwoli na “przeskoczenie” jednego dowolnego węzła, natomiast//
na przeskoczenie dowolnej liczby węzłów 😉Pozdrawiam,
Dzięki teraz rozumiem.