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:
Przykładowe węzły w powyższym dokumencie XML:
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:
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:
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:
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:
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”:
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.
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.
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”:
Ł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”
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ą:
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.
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żka | wynik |
---|---|
Sklep z książkami | Wybierz 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ążka | Wybierz podpozycje należące do księgarni wszystkie pozycje książkowe. |
// Książka | Wybierz wszystkie podelementy książki, niezależnie od ich pozycji w dokumencie. |
księgarnia // książka | Wybiera 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ą. |
// @Lang | Wybierz 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żka | wynik |
---|---|
/ Księgarnia / książka | Wybierz 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ążka | Wybierz 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ń.