Skraćena XPath sintaksa. Primjeri xpath upita za html Koristeći sljedeću os

XPath se koristi za navigaciju kroz elemente i atribute XML dokumenta. XPath je jedan od osnovnih elemenata u W3C XSLT standardu.

1 Šta se desilo XPath

XPath Expressions

XPath koristi izraze putanje za odabir pojedinačnih čvorova ili skupa čvorova u XML dokumentu. Ovi izrazi su veoma slični izrazima koje vidite kada radite sa tradicionalnim kompjuterskim sistemom datoteka.

Standardne XPath funkcije

XPath uključuje preko 100 ugrađenih funkcija. Postoje funkcije za nizove i numeričke vrijednosti, datum i vrijeme, poređenje čvorova i manipulaciju QName-om, upravljanje sekvencama, logičke vrijednosti i još mnogo toga.

XPath se koristi u XSLT-u

XPath je jedan od osnovnih elemenata u XSLT standardu. Bez znanja o XPath-u nećete moći kreirati XSLT dokumente.

2 Terminologija XPath

Čvorovi

Postoji sedam tipova čvorova u XPath-u: element, atribut, tekst, imenski prostor, upute za obradu, komentari i čvorovi dokumenta. XML dokumenti se obrađuju kao stabla čvorova. Gornji element stabla naziva se korijenski element. Pogledajte sljedeći XML dokument:

Harry Potter J. K. Rowling 2005 29.99

Primjer čvorova u XML dokumentu iznad:

(korijenski element) J. K. Rowling (čvor) lang="hr"(atribut)

Atomske vrijednosti

Atomske vrijednosti su čvorovi koji nemaju djece ili roditelja. Primjer atomskih vrijednosti:

J. K. Rowling "hr"

Elementi

Elementi su atomske vrijednosti ili čvorovi.

3 Vezačvorovi

Roditelj

Svaki element i atribut ima jednog roditelja. U sljedećem primjeru, element knjige je roditelj elementa naslova, autora, godine i cijene:

Harry Potter J K Rowling 2005 29.99

Potomci

Čvorovi elementa mogu imati nula, jedno ili više djece. U sljedećem primjeru, svi elementi "naslov", "autor", "godina" i "cijena" su potomci elementa knjige:

Harry Potter J K Rowling 2005 29.99

Elementi istog nivoa

To su čvorovi koji imaju istog roditelja. U sljedećem primjeru, elementi "naslov", "autor", "godina" i "cijena" su svi elementi istog nivoa:

Harry Potter J K Rowling 2005 29.99

Preci

Roditelj čvora, roditelj roditelja čvora, itd. U sljedećem primjeru, preci elementa naslova su elementi knjige i knjižare:

Harry Potter J K Rowling 2005 29.99

Potomci

Djeca čvora, djeca djece čvora, itd. U sljedećem primjeru, djeca elementa "knjižara" su elementi "knjiga", "naslov", "autor", "godina" i "cijena":

Harry Potter J K Rowling 2005 29.99

4 Sintaksa XPath

XPath koristi izraze putanje za odabir čvorova ili skupova čvorova u XML dokumentu. Čvor se može odabrati praćenjem putanje ili koracima. Mi ćemo koristiti sljedeći XML dokument u primjerima ispod.

Harry Potter 29.99 Učenje XML-a 39.95

Odabir čvora

Koristeći XPath izraze za odabir čvorova u XML dokumentu, možete odabrati čvor slijedeći putanju ili korake. Najkorisniji izrazi putanje su navedeni u nastavku:

Tabela ispod navodi neke putanje izraza i rezultat izvršavanja izraza:

XPath izraz Rezultat
knjižara Odabire sve čvorove pod nazivom "knjižara"
/knjižara Odabire osnovni element knjižare

Bilješka: Ako putanja počinje kosom crtom (/), to je uvijek apsolutna putanja do elementa!

knjižara/knjiga Odabire sve elemente "book" koji su potomci elementa "bookstore".
//book Bira sve elemente "knjige" bez obzira na to gdje se nalaze u dokumentu
knjižara//knjiga Odabire sve elemente "knjiga" koji su potomci elementa "knjižara", bez obzira na to gdje se nalaze ispod elementa "knjižara"
//@lang Odabire sve atribute koji se nazivaju "lang"

Predikati

Predikati se koriste za pronalaženje određenog čvora ili čvora koji sadrži određenu vrijednost. Predikati su uvijek okruženi uglastim zagradama. Tabela ispod navodi neke izraze putanje s predikatima i rezultat izraza:

XPath Expressions Rezultat
/knjižara/knjiga Odabire prvi element "book", koji je podređen elementu "bookstore".

Bilješka: U IE 5,6,7,8,9, prvi čvor ima indeks , ali prema W3C smjernicama, to je . Da biste riješili ovaj problem u IE, postavite opciju "SelectionLanguage" za XPath:

U JavaScriptu: xml.setProperty("SelectionLanguage", "XPath");
/knjižara/knjiga Odabire posljednji element "book" koji je podređen elementu "bookstore".
/knjižara/knjiga Odabire pretposljednji element "book", koji je podređen elementu "bookstore".
/knjižara/knjiga Odabir prva dva elementa "book" koji su potomci elementa "bookstore".
//naslov[@lang] Odabire sve elemente "title" koji imaju atribut pod nazivom "lang"
//naslov[@lang="hr"] Odabire sve elemente "title" koji imaju atribut "language" s vrijednošću "en"
/knjižara/knjiga Odabire sve elemente "book" nakon elementa "bookstore" koji imaju element "price" s vrijednošću većom od 35,00
/knjižara/knjiga/naslov Odabire sve elemente "naslova" knjige elementa "knjižara" koji imaju element "cijena" s vrijednošću većom od 35,00

Odabir nepoznatih čvorova

XPath specijalni znakovi se mogu koristiti za odabir nepoznatih XML čvorova.

U tabeli ispod, naveli smo neke putanje izraza i rezultate izraza:

Odabir više putanja

Korištenje operatora | u XPath izrazima možete odabrati više putanja. Tabela ispod navodi nekoliko izraza putanje i njihove rezultate:

5 Osovine XPath

Kasnije ćemo u primjeru koristiti sljedeći XML dokument.

Harry Potter 29.99 Učenje XML-a 39.95

Ose definiraju skupove čvorova u odnosu na trenutni čvor.

Naziv osi Rezultat
predak Odabire sve pretke (roditelje, djedove i bake, itd.) trenutnog čvora
predak-ili-sebe Odabire sve pretke (roditelje, djedove i bake, itd.) trenutnog čvora i samog trenutnog čvora
atribut
dijete
potomak Odabire svu djecu (djecu, unuke, itd.) trenutnog čvora
potomak-ili-sebe Odabire svu djecu (djecu, unuke, itd.) trenutnog čvora i samog trenutnog čvora
prateći Odabire sve u dokumentu nakon zatvaranja oznake trenutnog čvora
sledeći-sestra Bira sve čvorove istog nivoa nakon trenutnog čvora
imenskog prostora Bira sve čvorove u datom imenskom prostoru trenutnog čvora
roditelj Odabire roditelja trenutnog čvora
prethodni Odabire sve čvorove koji se pojavljuju prije trenutnog čvora u dokumentu, isključujući pretke, atributne čvorove i čvorove imenskog prostora
prethodni-sestra Odabire svu braću i sestre do trenutnog čvora
self Odabire trenutni čvor

6 Izrazi putanje uzorkovanja

Putanja lokacije može biti apsolutna ili relativna. Putanja apsolutne lokacije počinje kosom crtom (/), ali relativna putanja ne. U oba slučaja, putanja uzorkovanja se sastoji od jednog ili više koraka odvojenih kosim crtama:

Apsolutna putanja lokacije:

/korak/korak/...

Putanja dohvaćanja relativne lokacije:

Korak/korak/...

Svaki korak se vrednuje u odnosu na čvorove u trenutnom skupu čvorova. Korak se sastoji od:

  • osa (definira odnos stabla između odabranih čvorova i trenutnog čvora);
  • provjera čvora (identificira čvor unutar ose);
  • nula ili više predikata (za dalje preciziranje odabranog skupa čvorova)

Sintaksa koraka preuzimanja je:

Axisname::nodetestAxisname::nodetest[prediktor]

Primjer Rezultat
dijete::knjiga Odabire sve čvorove knjige koji su potomci trenutnog čvora
attribute::lang Bira atribut jezika (lang) trenutnog čvora
dijete::* Odabire svu djecu trenutnog čvora
atribut::* Bira sve atribute trenutnog čvora
dijete::text() Bira sve tekstualne čvorove trenutnog čvora
dijete::node() Odabire sve neposredne potomke trenutnog čvora
potomak::knjiga Odabire svu djecu trenutnog čvora
predak::knjiga Odabire sve pretke "knjiga" trenutnog čvora
predak-ili-sam::knjiga Odabire sve pretke knjige trenutnog čvora - i trenutni čvor ako je također knjiga
dijete::*/dijete::cijena Odabire sve potomke "price" jedan nivo udaljen od trenutnog čvora

7 Operateri XPath

XPath izrazi se vraćaju kao skup čvorova, nizova, logičkih ili numeričkih vrijednosti. Ispod je lista operatora koji se koriste u XPath izrazima:

Operater Opis Primjer
| Izračunava dva skupa čvorova //knjiga | //cd
+ Dodatak 6 + 4
- Oduzimanje 6 - 4
* Množenje 6 * 4
div Division 8 div 4
= Jednakost cijena=9,80
!= Nejednakost cijena!=9,80
< Manje od Cijena<9.80
<= Manje ili jednako cijena≤9,80
> Više nego cijena>9,80
>= Više ili jednako cijena≤9,80
ili Or cijena=9,80 ili cijena=9,70
i I cijena>9,00 i cijena<9.90
mod Ostatak divizije 5 mod 2

8 Primjeri XPath

Prođimo kroz osnovnu XPath sintaksu sa nekoliko primjera. Koristit ćemo sljedeći XML dokument "books.xml" u primjerima ispod:

Svakodnevni italijanski Giada De Laurentiis 2005 30.00 Harry Potter J K Rowling 2005 29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Učenje XML-a Erik T. Ray 2003 39.95

Učitavanje XML dokumenta

Koristite XMLHttpRequest za preuzimanje XML dokumenata, koje podržava većina modernih pretraživača:

Var xmlhttp=new XMLHttpRequest()

Kod za zastarjele Microsoft pretraživače (IE 5 i 6):

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

Odabir čvora

Nažalost, XPath može raditi drugačije u Internet Exploreru nego u drugim pretraživačima. U našim primjerima koristit ćemo kod koji bi trebao raditi u većini pretraživača. Internet Explorer koristi metodu "selectNodes()" za odabir čvorova u XML dokumentu:

XmlDoc.selectNodes(xpath);

Firefox, Chrome, Opera i Safari koriste metodu evaluate() za odabir čvorova iz XML dokumenta:

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

Odaberite sve naslove

Sljedeći primjer odabire sve čvorove zaglavlja:

/knjižara/knjiga/naslov

Odabir naslova prve knjige

Sljedeći primjer odabire naslov prvog čvora "knjiga" nakon elementa "knjižara":

/knjižara/knjiga/naslov

Odaberite sve cijene

Sljedeći primjer odabire tekst svih čvorova cijene:

/knjižara/knjiga/cijena

Odabire čvorove sa cijenom >35

Sljedeći primjer odabire sve čvorove s cijenama iznad 35:

/knjižara/knjiga/cijena

Odabir čvorova zaglavlja s cijenom >35

Sljedeći primjer odabire sve naslovne čvorove s cijenom većom od 35:

/knjižara/knjiga/naslov

Xpath je jezik upita za xml ili xhtml elemente dokumenta. Baš kao i SQL, xpath je deklarativni jezik upita. Da biste dobili podatke od interesa, potrebno je samo kreirati upit koji opisuje ove podatke. Prevodilac jezika xpath će obaviti sav prljavi posao umjesto vas.
Veoma zgodno, zar ne? Hajde da vidimo koje mogućnosti nudi xpath za pristup čvorovima web stranice.

Kreiranje zahtjeva za čvorove web stranice

Predstavljam vam mali laboratorijski rad, tokom kojeg ću demonstrirati kreiranje xpath zahtjeva za web stranicu. Moći ćete ponoviti zahtjeve koje sam dao i, što je najvažnije, pokušati ispuniti svoje. Nadam se da će zahvaljujući tome članak biti podjednako zanimljiv početnicima i programerima koji poznaju xpath to xml.

Za laboratorij će nam trebati:
- xhtml web stranica;
- Mozilla Firefox pretraživač sa dodacima;
- firebug;
- firePath ;
(možete koristiti bilo koji drugi preglednik sa podrškom za vizualni xpath)
- malo vremena.

Kao web stranicu za provođenje eksperimenta, predlažem glavnu stranicu web stranice World Wide Web Consortiuma ("http://w3.org"). Ova organizacija razvija jezike xquery(xpath), xhtml specifikaciju i mnoge druge internet standarde.

Zadatak
Preuzmite informacije o konferencijama konzorcijuma iz xhtml koda glavne stranice w3.org koristeći xpath upite.
Počnimo pisati xpath upite.
Prvi Xpath zahtjev
Otvorite karticu Firepath u FireBugu, odaberite element koji se analizira pomoću selektora, kliknite: Firepath je kreirao xpath zahtjev za odabrani element.

Ako ste odabrali naslov prvog događaja, onda će zahtjev biti ovakav:

Nakon uklanjanja nepotrebnih indeksa, upit će odgovarati svim elementima tipa zaglavlja.

Firepath ističe elemente koji odgovaraju upitu. U realnom vremenu možete vidjeti koji čvorovi dokumenta odgovaraju upitu.

Zahtjev za informacije o mjestima održavanja konferencije:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Ovako dobijamo listu sponzora:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

xpath sintaksa

Vratimo se upitima koje smo kreirali i shvatimo kako su strukturirani.
Razmotrimo detaljno prvi zahtjev

U ovom upitu sam podijelio tri dijela da demonstriram mogućnosti xpath-a. (Podjela na dijelove je nezgodna)

Prvi dio
.// - rekurzivno spuštanje na nulu ili više nivoa hijerarhije iz trenutnog konteksta. U našem slučaju, trenutni kontekst je korijen dokumenta

Drugi dio
* - bilo koji element,
[@id="w3c_home_upcoming_events"]– predikat na osnovu kojeg tražimo čvor koji ima id atribut jednak “w3c_home_upcoming_events”. ID-ovi XHTML elemenata moraju biti jedinstveni. Stoga bi upit "bilo koji element sa određenim ID-om" trebao vratiti jedini čvor koji tražimo.

Možemo zameniti * na tačno ime čvora div u ovom zahtjevu
div[@id="w3c_home_upcoming_events"]

Dakle, idemo niz stablo dokumenta do div[@id="w3c_home_upcoming_events"] čvora koji nam je potreban. Uopšte nas nije briga od kojih čvorova se sastoji DOM stablo i koliko nivoa hijerarhije ostaje iznad.

Treći dio
/ul/li/div/p/a–xpath je put do određenog elementa. Putanja se sastoji od koraka adresiranja i uslova provjere čvora (ul, li, itd.). Koraci su odvojeni znakom "/" (kosa crta).

xpath kolekcije
Nije uvijek moguće pristupiti čvoru od interesa pomoću predikata ili koraka adresiranja. Vrlo često postoji mnogo čvorova istog tipa na jednom hijerarhijskom nivou i potrebno je odabrati “samo prvi” ili “samo drugi” čvorovi. Za takve slučajeve obezbjeđuju se naplate.

xpath kolekcije vam omogućavaju da pristupite elementu po njegovom indeksu. Indeksi odgovaraju redosledu kojim su elementi predstavljeni u originalnom dokumentu. Serijski broj u zbirkama se računa od jedan.

Na osnovu činjenice da je „mesto“ uvek drugi pasus iza „naziv konferencije“, dobijamo sledeći upit:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Gdje je p drugi element u skupu za svaki čvor na listi /ul/li/div.

Slično, možemo dobiti i listu sponzora sa zahtjevom:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Neke xpath funkcije
U xpath-u postoji mnogo funkcija za rad sa elementima unutar kolekcije. Daću samo nekoliko njih.

zadnji():
Vraća posljednji element kolekcije.
Upit ul/li/div/p - vratit će posljednje pasuse za svaki "ul" čvor liste.
First() funkcija nije predviđena. Za pristup prvom elementu koristite indeks "1".

tekst():
Vraća testni sadržaj elementa.
.//a – dobijamo sve linkove sa tekstom “Arhiva”.

position() i mod:
position() - vraća poziciju elementa u skupu.
mod je ostatak divizije.

Kombinacijom ovih funkcija možemo dobiti:
- čak ni elementi ul/li
- parni elementi: ul/li

Operacije poređenja

  • < - логическое «меньше»
  • > - logično “veće od”
  • <= - логическое «меньше либо равно»
  • >= - logično “veće ili jednako”
ul/li , ul/li - popis elemenata počevši od 3. broja i obrnuto.

Na svoju ruku

Pokušajte dobiti:
- čak i URL linkove iz lijevog menija “Standardi”;
- zaglavlja svih vijesti, osim prve sa glavne stranice w3c.org.

Xpath u PHP5

$dom = novi DomDocument(); $dom->loadHTML($HTMLCode); $xpath = novi 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; )

Konačno

Koristeći jednostavan primjer, vidjeli smo mogućnosti xpath-a za pristup čvorovima web stranice.
Xpath je industrijski standard za pristup xml elementima i xhtml, xslt transformacijama.
Možete ga koristiti za raščlanjivanje bilo koje html stranice. Ako izvorni html kod sadrži značajne greške u markupu, provedite ga

Danas ćemo detaljnije pogledati temu korišćenja XPath-a sa PHP-om. U primjerima ćete vidjeti kako XPath značajno smanjuje količinu koda. Pogledajmo korištenje upita i funkcija u XPath-u.

Na početku ću vam dati dvije vrste dokumenata: DTD i XML, pomoću kojih ćemo pogledati funkcionisanje PHP DOM XPath. Evo kako izgledaju:

Knjiga Autor Užas prvo poglavlje Druga knjiga Drugi autor Naučna fantastika prvo poglavlje

Osnovni XPath upiti

Jednostavna XPath sintaksa omogućava vam pristup elementima u XML dokumentu. Na najjednostavniji način možete odrediti putanju do željenog elementa. Koristeći gore navedeni XML dokument, sljedeći XPath upit će vratiti kolekciju trenutnih elemenata pronađenih u elementu knjige:

//biblioteka/knjiga

Volim ovo! Dvije kose crte definiraju korijenski element dokumenta, a jedna kosa crta prelazi na podređeni element knjige. Jednostavno je i brzo, zar ne?

Ali šta ako želite da izaberete određeni element knjige iz skupa? Pretpostavimo da želite knjige "određenog autora". XPath upit za ovo bi bio:

//biblioteka/knjiga/autor/..

možeš koristiti tekst() u uglastim zagradama za upoređivanje vrijednosti čvora. Također «/..» znači da želimo da koristimo roditeljski element (tj. vratimo se jedan čvor iznad).

XPath upiti se izrađuju pomoću jedne ili dvije funkcije: upit() I ocijeniti(). Oboje formiraju zahtjev, ali razlika je u vraćenom rezultatu. query() će se uvijek vratiti DOMNodeList, Za razliku od ocijeniti()će vratiti tekstualni rezultat ako je moguće. Na primjer, ako bi vaš XPath upit vratio broj knjiga koje je napisao određeni autor, onda bi query() vratio praznu DOMNodeList, evaluate() bi jednostavno vratio broj, ovo možete koristiti direktno za dohvat podataka iz čvora .

XPath kod i prednosti brzine

Pogledajmo jednostavan primjer koji će vratiti broj knjiga koje je napisao određeni autor. Pogledaćemo prvu metodu na način na koji to uvek radimo, bez korišćenja XPath-a. Sada ćete shvatiti kako to učiniti bez XPath-a i koliko je lakše to učiniti sa XPath-om.

domDocument->getElementsByTagName("autor"); foreach ($elementi kao $element) ( if ($element->nodeValue == $author) ( $total++; ) ) vrati $number; )

Sljedeća metoda vraća isti rezultat, ali koristi XPath za odabir onih knjiga koje je napisao određeni autor.

domDocument); $result = $xpath->query($query); vratiti $result->length; )

Imajte na umu da ne moramo ponovo provjeravati vrijednost svakog elementa da bismo utvrdili koji je autor napisao svaku knjigu. Ali možemo još više pojednostaviti kod koristeći XPath funkciju count() za prebrojavanje sadržaja elemenata na ovoj putanji.

domDocument); return $xpath->evaluate($query); )

Možemo dobiti informacije koje su nam potrebne sa jednim linijskim XPath upitom. Nema potrebe za kreiranjem mnogo PHP filtera. Ovo je najlakši i najbrži način da napišete ovu funkcionalnost!

Imajte na umu da je evaluate() korišten u posljednjem primjeru. To je zato što funkcija count() vraća tekstualni rezultat. Upotreba query() će vratiti DOMNodeList, ali će biti prazna.

XPath je vrijedan korištenja jer ne samo da čini vaš PHP kod jednostavnijim, već nudi i prednost u brzini. Primijetio sam da je prva verzija bila 30% brža u prosjeku u odnosu na drugu. Ali treći je 10% brži od prvog. Naravno, ovo zavisi od vašeg servera i upita koje koristite. Upotreba XPath-a u njegovom čistom obliku daje najveće rezultate u brzini i lakoći pisanja koda.

XPath funkcije

Evo nekoliko funkcija koje se mogu koristiti s XPath-om. Također ćete pronaći mnoštvo resursa koji detaljno govore o svakoj dostupnoj funkciji. Ako trebate izračunati DOMNodeList ili usporediti nodeValue (vrijednost čvora), možete pronaći odgovarajuću XPath funkciju koja eliminira korištenje nepotrebnog PHP koda.

To već znate iz primjera funkcije count(). Koristimo funkciju id() da dobijemo naslove knjiga sa datim ISBN brojevima. Da biste to učinili, trebate koristiti sljedeći XPath izraz:

id("isbn1234 isbn1235")/naslov

Imajte na umu da vrijednosti koje tražite ne bi trebale biti zatvorene u zagrade, samo odvojene razmacima. Također, nemojte ni razmišljati o dodavanju zareza:

domDocument); $result = $xpath->query($query); $books = niz(); foreach ($rezultat kao $node) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) return $books; )

Rukovanje složenim funkcijama u XPath-u je nevjerovatno jednostavno.

Korištenje PHP funkcija sa XPath-om

Ponekad će vam trebati više funkcionalnosti koje standardne XPath funkcije ne mogu pružiti. Na sreću, PHP DOM dozvoljava izvornim PHP funkcijama da komuniciraju sa XPath upitima.

Pogledajmo primjer koji vraća broj riječi u naslovu knjige. U ovoj najjednostavnijoj funkciji ćemo napisati sljedeće:

domDocument); $result = $xpath->query($query); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; return str_word_count($title); )

Ali, također možemo uključiti funkciju str_word_count() direktno u XPath zahtjev. To se može učiniti u nekoliko koraka. Prije svega, moramo registrirati prostor imena sa XPath objektom. PHP funkcije u XPath zahtjevima se pozivaju pomoću stringa “php:functionString”, nakon čega se upisuje ime željene funkcije. Takođe, imenski prostor se detaljnije razmatra na http://php.net/xpath. Druge vrijednosti imenskog prostora će dati grešku. Nakon toga moramo pozvati registerPHPFunctions(). Ova funkcija govori PHP-u da kada se poziv obavi kroz imenski prostor "php:", PHP će upravljati ovim pozivom.

Primjer sintakse za pozivanje funkcija bi bio:

php:functionString("nameoffunction", arg, arg...)

Hajde da sve to spojimo u sljedećem primjeru funkcije getNumberOfWords():

domDocument); //registriraj php imenski prostor $xpath->registerNamespace("php", "http://php.net/xpath"); //sada se php funkcije mogu pozvati u xpath zahtjevima $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))"; return $xpath->evaluate($query); )

Imajte na umu da ne morate pozvati XPath funkciju text() da biste dobili tekst čvora. Metoda registerPHPFunctions() ovo čini automatskim. Iako će sljedeći primjer reda koda također biti važeći:

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

Registrovanje PHP funkcija nije ograničeno na funkcije koje su uključene u PHP. Možete definirati vlastite funkcije i koristiti ih unutar XPath-a. Jedina razlika je u tome što ćete morati koristiti "php:function" umjesto "php:functionString".

Napišimo funkciju izvan klase da demonstriramo osnovnu funkcionalnost. Funkcija koju ćemo koristiti vraća knjige autora "George Orwell". Trebalo bi vratiti true za svaki čvor koji želite uključiti u upit.

nodeValue == "George Orwell"; } !}

Argument koji se prosljeđuje funkciji je niz DOM elemenata. Ova funkcija prolazi kroz niz i određuje potrebne elemente, a zatim ih uključuje u DOMNodeList. U ovom primjeru, čvor koji se testira je bio /book, a koristili smo i /author da odredimo potrebne elemente.

Sada možemo kreirati funkciju getGeorgeOrwellBooks():

domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//biblioteka/knjiga1"; $result = $xpath->query($query); $books = niz(); foreach($rezultat kao $node) ( $books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) vratiti $books; )

Ako je compare() funkcija statična, tada morate izmijeniti XPath upit:

//biblioteka/knjiga

Da budem iskren, sva ova funkcionalnost je mogla biti implementirana korištenjem čistog XPath koda. Ali primjer pokazuje kako možete proširiti XPath upite i učiniti ih složenijima.

U zakljucku

XPath je odličan način za smanjenje količine koda i povećanje njegove obrade kada radite sa XML-om. Dodatna PHP DOM funkcionalnost omogućava vam da proširite XPath funkcije. Ovo je zaista korisna stvar, ako je koristite i udubite se u specifičnosti, morat ćete pisati sve manje koda.


XPath koristi izraze putanje za odabir čvorova u XML dokumentu ili skupu čvorova. Po čvoru duž putanje (puta) ili stupnja (koraci) do odabranog.

instance XML dokumenata

Ovaj XML dokument ćemo koristiti u primjerima ispod.


Harry Potter
29.99


Učenje XML-a
39.95

Odaberite čvor

XPath koristi izraze putanje za odabir čvorova u XML dokumentu. Ili duž putanje kroz čvor za odabir koraka. Ovo su najkorisniji izrazi putanje:

U tabeli ispod prikazujemo neke od putanja izraza i rezultat izraza:

izraz Putrezultat
knjižaraOdaberite sve podređene čvorove elementa knjige.
/ Knjižara

Odaberite knjižaru korijenskih elemenata.

Napomena: Ako putanja počinje kosom crtom (/), putanja je uvijek reprezentativna za apsolutnu putanju elementa!

knjižara/knjigaOdaberite podstavke koji pripadaju knjižari sve knjižare.
// BookOdaberite sve podelemente knjige, bez obzira na njihovu poziciju u dokumentu.
knjižara // knjOdabire sve elemente knjige koji nisu potomci knjižare elementa, bez obzira na njihovu poziciju u i ispod knjižare.
// @LangOdaberite sva svojstva pod nazivom Lang.

predikat(i)

Predikat se koristi za pronalaženje određenog čvora ili čvora koji sadrži navedenu vrijednost.

Predikat je stavljen u uglaste zagrade.

U tabeli ispod, naveli smo neke izraze putanje sa predikatima i rezultatom izraza:

izraz Putrezultat
/ Knjižara / knjOdaberite podelemente koji pripadaju prvom elementu radne knjige.
/Knjižara/knjiga [zadnji()]Odaberite podelemente koji pripadaju elementu zadnje knjige knjige.
/ Knjižara / knjiga [zadnji () - 1]Odaberite podstavke koje se odnose na zajedničku knjižaru drugog knjižnog artikla.
/Knjižara/knjiga [pozicija()<3] Odaberite prva dva elementa knjige elementa knjige koji pripadaju podelementima.
// Naslov [@lang]Odaberite sve atribute pod nazivom Lang ima naslov elementa.
// Naslov [@ LANG = "eng"]Odaberite sve nazive elemenata i ovi elementi imaju vrijednost engleskog atributa.
/knjižara/knjigaOdaberite sve elemente knjige elementa knjige i vrijednost elementa cijene koja mora biti veća od 35,00.
/knjižara/knjiga/naslovOdaberite sve elemente zaglavlja elementa knjige elementa knjige i u kojima vrijednost elementa cijene mora biti veća od 35,00.

Odaberite nepoznate čvorove

XPath zamjenski znakovi se mogu koristiti za odabir nepoznatih XML elemenata.

U tabeli ispod, naveli smo neke izraze putanje, kao i rezultate ovih izraza:

Odaberite više puteva

Korištenje izraza putanje "|" operatora, možete odabrati nekoliko putanja.

U tabeli ispod, naveli smo neke izraze putanje, kao i rezultate ovih izraza.