Skrócona składnia XPath. Przykłady zapytań xpath do HTML przy użyciu poniższej osi

XPath służy do poruszania się po elementach i atrybutach dokumentu XML. XPath jest jednym z podstawowych elementów standardu W3C XSLT.

1 Co się stało XPath

Wyrażenia XPath

XPath używa wyrażeń ścieżek do wybierania pojedynczych węzłów lub zestawu węzłów w dokumencie XML. Wyrażenia te są bardzo podobne do wyrażeń, które można zobaczyć podczas pracy z tradycyjnym komputerowym systemem plików.

Standardowe funkcje XPath

XPath zawiera ponad 100 wbudowanych funkcji. Dostępne są funkcje umożliwiające wartości łańcuchowe i numeryczne, datę i godzinę, porównywanie węzłów i manipulację QName, zarządzanie sekwencją, wartości logiczne i wiele innych.

XPath jest używany w XSLT

XPath jest jednym z podstawowych elementów standardu XSLT. Bez znajomości XPath nie będziesz w stanie tworzyć dokumentów XSLT.

2 Terminologia XPath

Węzły

W XPath istnieje siedem typów węzłów: element, atrybut, tekst, przestrzeń nazw, instrukcje przetwarzania, komentarze i węzły dokumentów. Dokumenty XML są przetwarzane jako drzewa węzłów. Najwyższy element drzewa nazywany jest elementem głównym. Spójrz na następujący dokument XML:

Harry'ego Pottera J.K. Rowling 2005 29.99

Przykładowe węzły w powyższym dokumencie XML:

(element główny) J.K. Rowling (węzeł) lang="pl"(atrybut)

Wartości atomowe

Wartości atomowe to węzły, które nie mają dzieci ani rodziców. Przykład wartości atomowych:

J. K. Rowling „en”

Elementy

Elementy są wartościami atomowymi lub węzłami.

3 Relacja węzły

Rodzic

Każdy element i atrybut ma jednego rodzica. W poniższym przykładzie element book jest elementem nadrzędnym elementów tytułu, autora, roku i ceny:

Harry'ego Pottera J.K. Rowling 2005 29.99

Potomków

Węzły elementów mogą mieć zero, jedno lub więcej elementów podrzędnych. W poniższym przykładzie elementy „tytuł”, „autor”, „rok” i „cena” są elementami podrzędnymi elementu książki:

Harry'ego Pottera J.K. Rowling 2005 29.99

Elementy na tym samym poziomie

Są to węzły, które mają tego samego rodzica. W poniższym przykładzie elementy „tytuł”, „autor”, „rok” i „cena” są elementami tego samego poziomu:

Harry'ego Pottera J.K. Rowling 2005 29.99

Przodkowie

Rodzic węzła, rodzic rodzica węzła itp. W poniższym przykładzie przodkami elementu tytułowego są elementy książki i księgarni:

Harry'ego Pottera J.K. Rowling 2005 29.99

Potomków

Dzieci węzła, dzieci dzieci węzła itp. W poniższym przykładzie dziećmi elementu „księgarnia” są elementy „książka”, „tytuł”, „autor”, „rok” i „cena”:

Harry'ego Pottera J.K. Rowling 2005 29.99

4 Składnia XPath

XPath używa wyrażeń ścieżek do wybierania węzłów lub zestawów węzłów w dokumencie XML. Węzeł można wybrać, podążając ścieżką lub krokami. W poniższych przykładach użyjemy następującego dokumentu XML.

Harry'ego Pottera 29.99 Nauka XML-a 39.95

Wybór węzła

Używając wyrażeń XPath do wybierania węzłów w dokumencie XML, można wybrać węzeł, podążając ścieżką lub wykonując kroki. Poniżej wymieniono najbardziej przydatne wyrażenia ścieżki:

Poniższa tabela zawiera listę niektórych ścieżek wyrażeń oraz wynik wykonania wyrażenia:

Wyrażenie XPath Wynik
Księgarnia Wybiera wszystkie węzły o nazwie „księgarnia”
/Księgarnia Wybiera element główny księgarni

Notatka: Jeśli ścieżka zaczyna się od ukośnika (/), jest to zawsze ścieżka bezwzględna do elementu!

księgarnia/książka Wybiera wszystkie elementy „książka”, które są dziećmi elementu „księgarnia”.
//książka Zaznacza wszystkie elementy „księgi” niezależnie od tego, gdzie się znajdują w dokumencie
księgarnia//książka Wybiera wszystkie elementy „książka”, które są dziećmi elementu „księgarnia”, niezależnie od tego, gdzie się znajdują pod elementem „księgarnia”
//@język Wybiera wszystkie atrybuty o nazwie „lang”

Predykaty

Predykaty służą do znalezienia określonego węzła lub węzła zawierającego określoną wartość. Predykaty są zawsze otoczone nawiasami kwadratowymi. Poniższa tabela zawiera listę niektórych wyrażeń ścieżki z predykatami oraz wynik wyrażenia:

Wyrażenia XPath Wynik
/księgarnia/książka Wybiera pierwszy element „książka”, który jest dzieckiem elementu „księgarnia”.

Notatka: W IE 5,6,7,8,9 pierwszy węzeł ma indeks , ale zgodnie z wytycznymi W3C jest to . Aby rozwiązać ten problem w IE, ustaw opcję „SelectionLanguage” dla XPath:

W JavaScript: xml.setProperty("Język Wyboru", "XPath");
/księgarnia/książka Wybiera ostatni element „książka”, który jest dzieckiem elementu „księgarnia”.
/księgarnia/książka Wybiera przedostatni element „książka”, który jest dzieckiem elementu „księgarnia”.
/księgarnia/książka Wybranie pierwszych dwóch elementów „książka”, które są dziećmi elementu „księgarnia”.
//tytuł[@język] Wybiera wszystkie elementy „title”, które mają atrybut o nazwie „lang”
//tytuł[@lang="pl"] Wybiera wszystkie elementy „tytułu”, które mają atrybut „język” o wartości „en”
/księgarnia/książka Wybiera wszystkie elementy „książka” po elemencie „księgarnia”, które mają element „cena” o wartości większej niż 35,00
/księgarnia/książka/tytuł Wybiera wszystkie elementy „tytułu” książki elementu „księgarnia”, które mają element „cena” o wartości większej niż 35,00

Wybieranie nieznanych węzłów

Do wybierania nieznanych węzłów XML można używać znaków specjalnych XPath.

W poniższej tabeli wymieniliśmy niektóre ścieżki wyrażeń i wyniki wyrażeń:

Wybieranie wielu ścieżek

Korzystanie z operatora | w wyrażeniach XPath można wybrać wiele ścieżek. W poniższej tabeli wymieniono kilka wyrażeń ścieżek i ich wyniki:

5 Osie XPath

W dalszej części przykładu użyjemy następującego dokumentu XML.

Harry'ego Pottera 29.99 Nauka XML-a 39.95

Osie definiują zbiory węzłów względem bieżącego węzła.

Nazwa osi Wynik
przodek Wybiera wszystkich przodków (rodziców, dziadków itp.) bieżącego węzła
przodek lub ja Wybiera wszystkich przodków (rodziców, dziadków itp.) bieżącego węzła i samego bieżącego węzła
atrybut
dziecko
potomek Wybiera wszystkie elementy podrzędne (dzieci, wnuki itp.) bieżącego węzła
potomek lub ja Wybiera wszystkie dzieci (dzieci, wnuki itp.) bieżącego węzła i sam bieżący węzeł
następny Zaznacza wszystko w dokumencie po zamknięciu znacznika bieżącego węzła
następujące rodzeństwo Wybiera wszystkie węzły tego samego poziomu po bieżącym węźle
przestrzeń nazw Wybiera wszystkie węzły w danej przestrzeni nazw bieżącego węzła
rodzic Wybiera element nadrzędny bieżącego węzła
poprzedzający Wybiera wszystkie węzły, które pojawiają się przed bieżącym węzłem w dokumencie, z wyłączeniem przodków, węzłów atrybutów i węzłów przestrzeni nazw
poprzednie rodzeństwo Wybiera wszystkie elementy równorzędne aż do bieżącego węzła
samego siebie Wybiera bieżący węzeł

6 Wyrażeniaścieżki próbkowania

Ścieżka lokalizacji może być bezwzględna lub względna. Bezwzględna ścieżka lokalizacji zaczyna się od ukośnika (/), ale ścieżka względna nie. W obu przypadkach ścieżka próbkowania składa się z jednego lub więcej kroków oddzielonych ukośnikami:

Bezwzględna ścieżka lokalizacji:

/krok/krok/...

Względna ścieżka pobierania lokalizacji:

Krok/krok/...

Każdy krok jest oceniany względem węzłów w bieżącym zestawie węzłów. Krok składa się z:

  • oś (definiuje relację drzewa pomiędzy wybranymi węzłami a bieżącym węzłem);
  • sprawdzenie węzła (identyfikuje węzeł w obrębie osi);
  • zero lub więcej predykatów (w celu dalszego udoskonalenia wybranego zestawu węzłów)

Składnia kroku pobierania jest następująca:

Nazwa osi::nodetestNazwa osi::test węzła[predyktor]

Przykład Wynik
dziecko::książka Wybiera wszystkie węzły książki, które są dziećmi bieżącego węzła
atrybut::język Wybiera atrybut języka (język) bieżącego węzła
dziecko::* Wybiera wszystkie elementy podrzędne bieżącego węzła
atrybut::* Wybiera wszystkie atrybuty bieżącego węzła
dziecko::tekst() Zaznacza wszystkie węzły tekstowe bieżącego węzła
dziecko::węzeł() Wybiera wszystkie bezpośrednie elementy podrzędne bieżącego węzła
potomek::książka Wybiera wszystkie elementy podrzędne bieżącego węzła
przodek::książka Wybiera wszystkich przodków „książek” bieżącego węzła
przodek-lub-ja::książka Wybiera wszystkich przodków książek bieżącego węzła i bieżącego węzła, jeśli jest to również książka
dziecko::*/dziecko::cena Wybiera wszystkie elementy podrzędne „ceny” o jeden poziom od bieżącego węzła

7 Operatorzy XPath

Wyrażenia XPath zwracają jako zbiór węzłów, ciągów znaków, wartości logicznych lub wartości liczbowych. Poniżej znajduje się lista operatorów używanych w wyrażeniach XPath:

Operator Opis Przykład
| Oblicza dwa zestawy węzłów //książka | //płyta CD
+ Dodatek 6 + 4
- Odejmowanie 6 - 4
* Mnożenie 6 * 4
div Dział 8 dział 4
= Równość cena=9,80
!= Nierówność cena!=9,80
< Mniej niż cena<9.80
<= Mniej lub równo cena≤9,80
> Więcej niż cena>9,80
>= Więcej lub równo cena≤9,80
Lub Lub cena=9,80 lub cena=9,70
I I cena>9,00 i cena<9.90
mod Pozostała część podziału 5 moda 2

8 Przykłady XPath

Przyjrzyjmy się podstawowej składni XPath na kilku przykładach. W poniższych przykładach użyjemy następującego dokumentu XML „books.xml”:

Na co dzień włoski Giada De Laurentiis 2005 30.00 Harry'ego Pottera J.K. Rowling 2005 29.99 Uruchomienie XQuery Jamesa McGoverna Według Bothnera Kurta Cagle’a Jamesa Linna Vaidyanathan Nagarajan 2003 49.99 Nauka XML-a Erika T. Raya 2003 39.95

Ładowanie dokumentu XML

Użyj XMLHttpRequest do pobrania dokumentów XML, który jest obsługiwany przez większość nowoczesnych przeglądarek:

Var xmlhttp=nowy XMLHttpRequest()

Kod dla starszych przeglądarek Microsoft (IE 5 i 6):

Var xmlhttp=nowy ActiveXObject("Microsoft.XMLHTTP")

Wybór węzła

Niestety XPath może działać inaczej w przeglądarce Internet Explorer niż w innych przeglądarkach. W naszych przykładach użyjemy kodu, który powinien działać w większości przeglądarek. Internet Explorer używa metody „selectNodes()” do wybierania węzłów w dokumencie XML:

XmlDoc.selectNodes(xpath);

Przeglądarki Firefox, Chrome, Opera i Safari używają metody oceny() do wybierania węzłów z dokumentu XML:

XmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);

Wybierz wszystkie tytuły

Poniższy przykład wybiera wszystkie węzły nagłówka:

/księgarnia/książka/tytuł

Wybór tytułu pierwszej książki

Poniższy przykład wybiera tytuł pierwszego węzła „książka” po elemencie „księgarnia”:

/księgarnia/książka/tytuł

Wybierz wszystkie ceny

Poniższy przykład wybiera tekst wszystkich węzłów cenowych:

/księgarnia/książka/cena

Wybiera węzły z ceną >35

Poniższy przykład wybiera wszystkie węzły z cenami powyżej 35:

/księgarnia/książka/cena

Wybieranie węzłów nagłówka z ceną >35

Poniższy przykład wybiera wszystkie węzły tytułowe z ceną większą niż 35:

/księgarnia/książka/tytuł

Xpath to język zapytań dla elementów dokumentów xml lub xhtml. Podobnie jak SQL, xpath jest deklaratywnym językiem zapytań. Aby pozyskać interesujące nas dane wystarczy utworzyć zapytanie opisujące te dane. Tłumacz języka xpath wykona całą brudną robotę za Ciebie.
Bardzo wygodne, prawda? Zobaczmy, jakie możliwości oferuje xpath w zakresie dostępu do węzłów strony internetowej.

Tworzenie żądania do węzłów strony internetowej

Zwracam uwagę na małą pracę laboratoryjną, podczas której zademonstruję tworzenie żądań xpath do strony internetowej. Będziesz mógł powtórzyć prośby, które ci przekazałem i, co najważniejsze, spróbować spełnić własne. Mam nadzieję, że dzięki temu artykuł będzie równie ciekawy dla początkujących jak i programistów zaznajomionych z xpath to xml.

Do laboratorium będziemy potrzebować:
- strona internetowa xhtml;
- Przeglądarka Mozilla Firefox z dodatkami;
- podpalacz;
- ścieżka ognia;
(możesz użyć dowolnej innej przeglądarki z obsługą wizualnej ścieżki xpath)
- mało czasu.

Jako stronę internetową do przeprowadzenia eksperymentu proponuję stronę główną serwisu World Wide Web Consortium ("http://w3.org"). To właśnie ta organizacja opracowuje języki xquery(xpath), specyfikację xhtml i wiele innych standardów internetowych.

Zadanie
Uzyskaj informacje o konferencjach konsorcjum z kodu xhtml strony głównej w3.org za pomocą zapytań xpath.
Zacznijmy pisać zapytania xpath.
Pierwsze żądanie Xpath
Otwórz zakładkę Firepath w FireBug, wybierz selektorem element do analizy, kliknij: Firepath utworzył żądanie xpath dla wybranego elementu.

Jeśli wybrałeś tytuł pierwszego wydarzenia, żądanie będzie wyglądało następująco:

Po usunięciu zbędnych indeksów zapytanie dopasuje wszystkie elementy typu nagłówkowego.

Firepath podświetla elementy pasujące do zapytania. Możesz zobaczyć w czasie rzeczywistym, które węzły dokumentu pasują do zapytania.

Zapytanie o informacje dotyczące miejsc konferencji:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Oto jak otrzymujemy listę sponsorów:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

składnia xpath

Wróćmy do utworzonych przez nas zapytań i poznajmy ich strukturę.
Rozważmy szczegółowo pierwszą prośbę

W tym zapytaniu podzieliłem trzy części, aby zademonstrować możliwości xpath. (Podział na części jest trudny)

Pierwsza część
.// - rekurencyjne zejście do zera lub większej liczby poziomów hierarchii z bieżącego kontekstu. W naszym przypadku bieżącym kontekstem jest korzeń dokumentu

Druga część
* - dowolny element,
[@id="w3c_home_upcoming_events"]– predykat, na podstawie którego szukamy węzła posiadającego atrybut id równy „w3c_home_upcoming_events”. Identyfikatory elementów XHTML muszą być unikalne. Dlatego zapytanie „dowolny element o określonym identyfikatorze” powinno zwrócić jedyny węzeł, którego szukamy.

Możemy wymienić * do dokładnej nazwy węzła div w tej prośbie
div[@id="w3c_home_upcoming_events"]

W ten sposób schodzimy w dół drzewa dokumentów do potrzebnego nam węzła div[@id="w3c_home_upcoming_events"]. Nie interesuje nas w ogóle, z jakich węzłów składa się drzewo DOM i ile poziomów hierarchii pozostaje powyżej.

Trzecia część
/ul/li/div/p/a–xpath to ścieżka do określonego elementu. Ścieżka składa się z kroków adresowania i warunków sprawdzania węzła (ul, li itp.). Kroki oddzielane są znakiem „/” (ukośnikiem).

kolekcje xpath
Nie zawsze jest możliwy dostęp do interesującego węzła za pomocą predykatu lub kroków adresowania. Bardzo często na jednym poziomie hierarchii występuje wiele węzłów tego samego typu i konieczne jest wybranie „tylko pierwszego” lub „tylko drugiego” węzła. W takich przypadkach organizowane są zbiórki.

Kolekcje xpath umożliwiają dostęp do elementu poprzez jego indeks. Indeksy odpowiadają kolejności, w jakiej elementy zostały zaprezentowane w dokumencie oryginalnym. Numer seryjny w kolekcjach liczony jest od jednego.

Bazując na tym, że „miejsce” jest zawsze drugim akapitem po „nazwie konferencji”, otrzymujemy następujące zapytanie:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Gdzie p jest drugim elementem w zestawie dla każdego węzła na liście /ul/li/div.

Podobnie możemy otrzymać listę sponsorów wraz z zapytaniem:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Niektóre funkcje xpath
W xpath istnieje wiele funkcji umożliwiających pracę z elementami kolekcji. Podam tylko kilka z nich.

ostatni():
Zwraca ostatni element kolekcji.
Zapytanie ul/li/div/p - zwróci ostatnie akapity dla każdego węzła listy „ul”.
Funkcja First() nie jest dostępna. Aby uzyskać dostęp do pierwszego elementu, użyj indeksu „1”.

tekst():
Zwraca zawartość testową elementu.
.//a – wszystkie linki otrzymujemy z tekstem „Archiwum”.

pozycja() i mod:
position() - zwraca pozycję elementu w zestawie.
mod to reszta z dzielenia.

Łącząc te funkcje możemy otrzymać:
- nawet elementów ul/li
- elementy parzyste: ul/li

Operacje porównawcze

  • < - логическое «меньше»
  • > - logiczne „większe niż”
  • <= - логическое «меньше либо равно»
  • >= - logiczne „większe lub równe”
ul/li , ul/li - lista elementów rozpoczynająca się od 3-ej liczby i odwrotnie.

Na własną rękę

Postarać się zdobyć:
- nawet linki URL z lewego menu „Standardy”;
- nagłówki wszystkich aktualności, z wyjątkiem pierwszego ze strony głównej w3c.org.

Xpath w PHP5

$dom = nowy DomDocument(); $dom->loadHTML($HTMLCode); $xpath = nowa DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $obj) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; )

Wreszcie

Na prostym przykładzie zobaczyliśmy możliwości xpath w zakresie dostępu do węzłów strony internetowej.
Xpath to branżowy standard dostępu do elementów XML i transformacji xhtml i xslt.
Można go używać do analizowania dowolnej strony HTML. Jeśli źródłowy kod HTML zawiera istotne błędy w znacznikach, przeprowadź go

Dzisiaj przyjrzymy się bliżej tematowi użycia XPath z PHP. Na przykładach zobaczysz, jak XPath znacząco zmniejsza ilość kodu. Przyjrzyjmy się używaniu zapytań i funkcji w XPath.

Na początek udostępnię Ci dwa rodzaje dokumentów: DTD i XML, za pomocą których przyjrzymy się funkcjonowaniu PHP DOM XPath. Oto jak wyglądają:

Książka Autor Przerażenie rozdział pierwszy Kolejna książka Inny autor Fantastyka naukowa rozdział pierwszy

Podstawowe zapytania XPath

Prosta składnia XPath umożliwia dostęp do elementów w dokumencie XML. W najprostszy sposób możesz określić ścieżkę do żądanego elementu. Korzystając z dokumentu XML podanego powyżej, następujące zapytanie XPath zwróci kolekcję bieżących elementów znalezionych w elemencie book:

//książka z biblioteki

Lubię to! Dwa ukośniki definiują element główny dokumentu, a jeden ukośnik przechodzi do elementu podrzędnego książki. To proste i szybkie, prawda?

A co jeśli chcesz wybrać konkretny element książki z zestawu? Załóżmy, że chcesz książki „pewnego autora”. Zapytanie XPath w tym przypadku wyglądałoby następująco:

//biblioteka/książka/autor/..

możesz użyć tekst() w nawiasach kwadratowych, aby porównać wartość węzła. Również «/..» oznacza, że ​​chcemy użyć elementu nadrzędnego (tj. cofnąć się o jeden węzeł powyżej).

Zapytania XPath są tworzone przy użyciu jednej lub dwóch funkcji: zapytanie() I oceniać(). Oba tworzą żądanie, ale różnica polega na zwróconym wyniku. query() zawsze zwróci Lista węzłów DOM, W odróżnieniu oceniać() zwróci wynik tekstowy, jeśli to możliwe. Na przykład, jeśli zapytanie XPath zwróci liczbę książek napisanych przez określonego autora, zapytanie() zwróci pustą listę DOMNodeList, ocena() po prostu zwróci liczbę. Można użyć tego bezpośrednio do pobrania danych z węzła .

Kod XPath i korzyści związane z szybkością

Spójrzmy na prosty przykład, który zwróci liczbę książek napisanych przez konkretnego autora. Przyjrzymy się pierwszej metodzie w zwykły sposób, bez użycia XPath. Teraz zrozumiesz, jak to zrobić bez XPath i o ile łatwiej jest to zrobić za pomocą XPath.

domDocument->getElementsByTagName("autor"); foreach ($elementy jako $element) ( if ($element->nodeValue == $author) ( $total++; ) ) return $number; )

Następna metoda zwraca ten sam wynik, ale używa XPath do wybrania książek napisanych przez określonego autora.

domDokument); $wynik = $xpath->zapytanie($zapytanie); zwróć $wynik->długość; )

Pamiętaj, że nie musimy ponownie sprawdzać wartości każdego elementu, aby określić, który autor napisał daną książkę. Możemy jednak bardziej uprościć kod, korzystając z funkcji XPath liczyć() policzyć zawartość elementów w tej ścieżce.

domDokument); zwróć $xpath->oceń($zapytanie); )

Możemy uzyskać potrzebne informacje za pomocą jednowierszowego zapytania XPath. Nie ma potrzeby tworzenia wielu filtrów PHP. To najłatwiejszy i najszybszy sposób napisania tej funkcjonalności!

Należy zauważyć, że w ostatnim przykładzie użyto funkcji Evalu(). Dzieje się tak, ponieważ funkcja count() zwraca wynik tekstowy. Użycie query() zwróci DOMNodeList, ale będzie ona pusta.

Warto używać XPath, ponieważ nie tylko upraszcza kod PHP, ale także zapewnia korzyść w zakresie szybkości. Zauważyłem, że pierwsza wersja była średnio o 30% szybsza w porównaniu do drugiej. Ale trzeci jest o 10% szybszy niż pierwszy. Zależy to oczywiście od Twojego serwera i używanych zapytań. Używanie XPath w czystej postaci daje największe rezultaty w szybkości i łatwości pisania kodu.

Funkcje XPath

Oto kilka funkcji, których można używać z XPath. Znajdziesz tu także mnóstwo zasobów szczegółowo opisujących każdą dostępną funkcję. Jeśli potrzebujesz obliczyć DOMNodeList lub porównać wartość węzła (wartość węzła), możesz znaleźć odpowiednią funkcję XPath, która eliminuje użycie niepotrzebnego kodu PHP.

Znasz to już z przykładu funkcji count(). Skorzystajmy z funkcji id(), aby uzyskać tytuły książek o podanych numerach ISBN. Aby to zrobić, musisz użyć następującego wyrażenia XPath:

id("isbn1234 isbn1235")/tytuł

Pamiętaj, że wartości, których szukasz, nie powinny być ujęte w nawiasy, a jedynie oddzielone spacjami. Nawet nie myśl o dodaniu przecinka:

domDokument); $wynik = $xpath->zapytanie($zapytanie); $książki = tablica(); foreach ($wynik jako $node) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) return $books; )

Obsługa złożonych funkcji w XPath jest niezwykle prosta.

Używanie funkcji PHP z XPath

Czasami będziesz potrzebować większej funkcjonalności, której nie zapewniają standardowe funkcje XPath. Na szczęście PHP DOM umożliwia natywnym funkcjom PHP interakcję z zapytaniami XPath.

Spójrzmy na przykład, który zwraca liczbę słów w tytule książki. W tej najprostszej funkcji napiszemy co następuje:

domDokument); $wynik = $xpath->zapytanie($zapytanie); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; return str_word_count($tytuł); )

Możemy jednak także uwzględnić funkcję str_word_count() bezpośrednio w żądaniu XPath. Można to zrobić w kilku krokach. Przede wszystkim musimy zarejestrować przestrzeń nazw za pomocą obiektu XPath. Funkcje PHP w żądaniach XPath wywoływane są za pomocą ciągu „php:functionString”, po którym zapisywana jest nazwa żądanej funkcji. Ponadto przestrzeń nazw omówiono bardziej szczegółowo pod adresem http://php.net/xpath. Inne wartości przestrzeni nazw spowodują błąd. Następnie musimy wywołać funkcję RegisterPHPFunctions(). Ta funkcja informuje PHP, że kiedy wykonywane jest wywołanie poprzez przestrzeń nazw „php:”, PHP obsłuży to wywołanie.

Przykładowa składnia wywoływania funkcji będzie następująca:

php:functionString("nazwa funkcji", arg, arg...)

Zestawmy to wszystko w następującym przykładzie funkcji getNumberOfWords():

domDokument); //zarejestruj przestrzeń nazw php $xpath->registerNamespace("php", "http://php.net/xpath"); //teraz funkcje php można wywoływać w żądaniach xpath $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))"; zwróć $xpath->oceń($zapytanie); )

Pamiętaj, że nie musisz wywoływać funkcji XPath text(), aby uzyskać tekst węzła. Metoda RegisterPHPFunctions() sprawia, że ​​jest to automatyczne. Chociaż następujący przykładowy wiersz kodu będzie również prawidłowy:

php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))

Rejestrowanie funkcji PHP nie ogranicza się do funkcji zawartych w PHP. Możesz definiować własne funkcje i używać ich w XPath. Jedyna różnica polega na tym, że będziesz musiał użyć „php:function” zamiast „php:functionString”.

Napiszmy funkcję poza klasą, aby zademonstrować podstawową funkcjonalność. Funkcja, której użyjemy, zwraca książki autora „George Orwell”. Powinno zwrócić wartość true dla każdego węzła, który chcesz uwzględnić w zapytaniu.

nodeValue == "George Orwell"; } !}

Argument przekazywany do funkcji jest tablicą elementów DOM. Funkcja ta przechodzi przez tablicę i określa niezbędne elementy, a następnie umieszcza je w DOMNodeList. W tym przykładzie testowanym węzłem był /book, a do określenia wymaganych elementów użyliśmy także /author.

Teraz możemy utworzyć funkcję getGeorgeOrwellBooks():

domDokument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//biblioteka/książka1"; $wynik = $xpath->zapytanie($zapytanie); $książki = tablica(); foreach($result as $node) ( $books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) zwraca $books; )

Jeśli funkcja Compare() jest statyczna, musisz zmienić zapytanie XPath:

//książka z biblioteki

Szczerze mówiąc, całą tę funkcjonalność można było zaimplementować przy użyciu czystego kodu XPath. Ale przykład pokazuje, jak można rozszerzyć zapytania XPath i uczynić je bardziej złożonymi.

Podsumowując

XPath to świetny sposób na zmniejszenie ilości kodu i zwiększenie jego przetwarzania podczas pracy z XML. Dodatkowa funkcjonalność PHP DOM pozwala na rozszerzenie funkcji XPath. Jest to naprawdę przydatna rzecz, jeśli z niej skorzystasz i zagłębisz się w szczegóły, będziesz musiał pisać coraz mniej kodu.


XPath używa wyrażeń ścieżek do wybierania węzłów w dokumencie XML lub zestawie węzłów. Przez węzeł wzdłuż ścieżki (ścieżki) lub etapu (kroków) do wybranego.

instancji dokumenty XML

Będziemy używać tego dokumentu XML w poniższych przykładach.


Harry'ego Pottera
29.99


Nauka XML-a
39.95

Wybierz węzeł

XPath używa wyrażeń ścieżek do wybierania węzłów w dokumencie XML. Lub wzdłuż ścieżki przez węzeł, aby wybrać krok. Poniżej znajdują się najbardziej przydatne wyrażenia ścieżki:

W poniższej tabeli przedstawiamy niektóre ścieżki wyrażeń i wynik wyrażenia:

wyrażenie Ścieżkawynik
Sklep z książkamiWybierz wszystkie węzły podrzędne elementu książki.
/ Księgarnia

Wybierz księgarnię z elementami głównymi.

Uwaga: Jeśli ścieżka zaczyna się od ukośnika (/), ścieżka jest zawsze reprezentatywna dla ścieżki bezwzględnej elementu!

księgarnia/książkaWybierz podpozycje należące do księgarni wszystkie pozycje książkowe.
// KsiążkaWybierz wszystkie podelementy książki, niezależnie od ich pozycji w dokumencie.
księgarnia // książkaWybiera wszystkie elementy książki, które nie są potomkami księgarni danego elementu, niezależnie od ich położenia w księgarni i pod nią.
// @LangWybierz wszystkie właściwości o nazwie Lang.

Predykaty

Predykat służy do znalezienia określonego węzła lub węzłów zawierających określoną wartość.

Predykat jest ujęty w nawiasy kwadratowe.

W poniższej tabeli wymieniliśmy niektóre wyrażenia ścieżki z predykatami i wynikiem wyrażenia:

wyrażenie Ścieżkawynik
/ Księgarnia / książkaWybierz podelementy należące do pierwszego elementu skoroszytu.
/Księgarnia/książka [last()]Wybierz podelementy należące do ostatniego elementu książki.
/ Księgarnia / książka [ostatnia () - 1]Wybierz podpozycje związane z księgarnią wspólną drugiej pozycji książki.
/Księgarnia/książka [pozycja()<3] Wybierz pierwsze dwa elementy książki elementu książki należące do podelementów.
// Tytuł [@lang]Zaznacz wszystkie atrybuty o nazwie Lang, które mają tytuł elementu.
// Tytuł [@ LANG = "pol"]Wybierz wszystkie nazwy elementów, a te elementy mają wartość atrybutu w języku angielskim.
/księgarnia/książkaWybierz wszystkie elementy książki elementu książki oraz wartość elementu ceny, która musi być większa niż 35,00.
/księgarnia/książka/tytułWybierz wszystkie elementy nagłówka elementu księgowego elementu księgowego, w których wartość elementu ceny musi być większa niż 35,00.

Wybierz nieznane węzły

Do wybierania nieznanych elementów XML można używać symboli wieloznacznych XPath.

W poniższej tabeli wymieniliśmy niektóre wyrażenia ścieżki, a także wyniki tych wyrażeń:

Wybierz wiele ścieżek

Używanie wyrażenia ścieżki „|” operatora, możesz wybrać kilka ścieżek.

W poniższej tabeli wymieniliśmy niektóre wyrażenia ścieżki, a także wyniki tych wyrażeń.