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:
Primjer čvorova u XML dokumentu iznad:
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:
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:
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:
Preci
Roditelj čvora, roditelj roditelja čvora, itd. U sljedećem primjeru, preci elementa naslova su elementi knjige i knjižare:
Potomci
Djeca čvora, djeca djece čvora, itd. U sljedećem primjeru, djeca elementa "knjižara" su elementi "knjiga", "naslov", "autor", "godina" i "cijena":
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.
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.
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:
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”
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:
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.
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 Put | rezultat |
---|---|
knjižara | Odaberite 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/knjiga | Odaberite podstavke koji pripadaju knjižari sve knjižare. |
// Book | Odaberite sve podelemente knjige, bez obzira na njihovu poziciju u dokumentu. |
knjižara // knj | Odabire sve elemente knjige koji nisu potomci knjižare elementa, bez obzira na njihovu poziciju u i ispod knjižare. |
// @Lang | Odaberite 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 Put | rezultat |
---|---|
/ Knjižara / knj | Odaberite 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/knjiga | Odaberite sve elemente knjige elementa knjige i vrijednost elementa cijene koja mora biti veća od 35,00. |
/knjižara/knjiga/naslov | Odaberite 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.