Sintaxa XPath scurtată. Exemple de interogări xpath către html Folosind următoarea axă

XPath este folosit pentru a naviga prin elementele și atributele unui document XML. XPath este unul dintre elementele de bază ale standardului W3C XSLT.

1 Ce s-a întâmplat XPath

Expresii XPath

XPath utilizează expresii de cale pentru a selecta noduri individuale sau un set de noduri într-un document XML. Aceste expresii sunt foarte asemănătoare cu expresiile pe care le vedeți când lucrați cu un sistem tradițional de fișiere de computer.

Funcții standard XPath

XPath include peste 100 de funcții încorporate. Există funcții pentru șir și valori numerice, dată și oră, compararea nodurilor și manipularea QName, managementul secvenței, valorile booleene și multe altele.

XPath este utilizat în XSLT

XPath este unul dintre elementele de bază ale standardului XSLT. Fără cunoștințe despre XPath, nu veți putea crea documente XSLT.

2 Terminologie XPath

Noduri

Există șapte tipuri de noduri în XPath: element, atribut, text, spațiu de nume, instrucțiuni de procesare, comentarii și noduri de document. Documentele XML sunt procesate ca arbori de noduri. Elementul superior al arborelui se numește element rădăcină. Uitați-vă la următorul document XML:

Harry Potter JK Rowling 2005 29.99

Exemple de noduri din documentul XML de mai sus:

(element rădăcină) JK Rowling (nodul) lang="ro"(atribut)

Valorile atomice

Valorile atomice sunt noduri care nu au copii sau părinți. Exemplu de valori atomice:

J. K. Rowling „ro”

Elemente

Elementele sunt valori atomice sau noduri.

3 Relaţie noduri

Mamă

Fiecare element și atribut are un părinte. În exemplul următor, elementul carte este părintele elementelor titlu, autor, an și preț:

Harry Potter JK Rowling 2005 29.99

Urmasi

Nodurile elementului pot avea zero, unul sau mai mulți copii. În exemplul următor, elementele „titlu”, „autor”, „an” și „preț” sunt toate copii ale elementului carte:

Harry Potter JK Rowling 2005 29.99

Elemente de același nivel

Acestea sunt noduri care au același părinte. În exemplul următor, elementele „titlu”, „autor”, „an” și „preț” sunt toate elemente de același nivel:

Harry Potter JK Rowling 2005 29.99

Strămoșii

Părinte al nodului, părinte al părintelui nodului etc. În exemplul următor, strămoșii elementului titlu sunt elementele de carte și de librărie:

Harry Potter JK Rowling 2005 29.99

Urmasi

Copii unui nod, copii ai copiilor unui nod etc. În exemplul următor, copiii elementului „librărie” sunt elementele „carte”, „titlu”, „autor”, „an” și „preț”:

Harry Potter JK Rowling 2005 29.99

4 Sintaxă XPath

XPath utilizează expresii de cale pentru a selecta noduri sau seturi de noduri într-un document XML. Un nod poate fi selectat urmând o cale sau pe pași. Vom folosi următorul document XML în exemplele de mai jos.

Harry Potter 29.99 Învățarea XML 39.95

Selectarea nodului

Folosind expresii XPath pentru a selecta noduri dintr-un document XML, puteți selecta un nod urmând o cale sau pași. Cele mai utile expresii de cale sunt enumerate mai jos:

Tabelul de mai jos listează câteva căi de expresie și rezultatul executării expresiei:

Expresia XPath Rezultat
librărie Selectează toate nodurile numite „librărie”
/librărie Selectează elementul rădăcină al librăriei

Notă: Dacă o cale începe cu o bară oblică (/), aceasta este întotdeauna o cale absolută către element!

librărie/carte Selectează toate elementele „carte” care sunt copii ale elementului „librărie”.
//carte Selectează toate elementele „cartei”, indiferent de locul în care se află în document
librărie//carte Selectează toate elementele „carte” care sunt copii ale elementului „librărie”, indiferent de locul în care se află sub elementul „librărie”
//@lang Selectează toate atributele care sunt denumite „lang”

Predicate

Predicatele sunt folosite pentru a găsi un anumit nod sau un nod care conține o anumită valoare. Predicatele sunt întotdeauna înconjurate de paranteze drepte. Tabelul de mai jos listează câteva expresii de cale cu predicate și rezultatul expresiei:

Expresii XPath Rezultat
/librărie/carte Selectează primul element „carte”, care este un copil al elementului „librărie”.

Notă:În IE 5,6,7,8,9, primul nod are un indice de , dar conform ghidurilor W3C, este . Pentru a rezolva această problemă în IE, setați opțiunea „SelectionLanguage” pentru XPath:

În JavaScript: xml.setProperty("SelectionLanguage", "XPath");
/librărie/carte Selectează ultimul element „carte” care este un copil al elementului „librărie”.
/librărie/carte Selectează penultimul element „carte”, care este un copil al elementului „librărie”.
/librărie/carte Selectarea primelor două elemente „carte” care sunt copii ale elementului „librărie”.
//titlu[@lang] Selectează toate elementele „titlu” care au un atribut numit „lang”
//titlu[@lang="ro"] Selectează toate elementele „titlu” care au un atribut „limbă” cu valoarea „en”
/librărie/carte Selectează toate elementele „carte” după elementul „librărie” care au un element „preț” cu o valoare mai mare de 35,00
/librărie/carte/titlu Selectează toate elementele „titlu” cărții ale elementului „librărie” care au un element „preț” cu o valoare mai mare de 35,00

Selectarea nodurilor necunoscute

Caracterele speciale XPath pot fi folosite pentru a selecta noduri XML necunoscute.

În tabelul de mai jos, am enumerat câteva căi de expresie și rezultate ale expresiei:

Selectarea mai multor căi

Folosind operatorul | în expresiile XPath puteți selecta mai multe căi. Tabelul de mai jos listează mai multe expresii de cale și rezultatele acestora:

5 Axe XPath

Vom folosi următorul document XML mai târziu în exemplu.

Harry Potter 29.99 Învățarea XML 39.95

Axele definesc seturi de noduri, relativ la nodul curent.

Numele axei Rezultat
strămoş Selectează toți strămoșii (părinți, bunici etc.) ai nodului curent
strămoș sau-sine Selectează toți strămoșii (părinți, bunici etc.) ai nodului curent și ai nodului curent în sine
atribut
copil
descendent Selectează toți copiii (copii, nepoți etc.) ai nodului curent
descendent-sau-sine Selectează toți copiii (copii, nepoți etc.) ai nodului curent și ai nodului curent însuși
ca urmare a Selectează totul din document după ce eticheta nodului curent se închide
următor-frate Selectează toate nodurile de același nivel după nodul curent
spatiu de nume Selectează toate nodurile din spațiul de nume dat al nodului curent
mamă Selectează părintele nodului curent
precedent Selectează toate nodurile care apar înaintea nodului curent din document, excluzând strămoșii, nodurile de atribut și nodurile de spațiu de nume
frate-precedent Selectează toți frații până la nodul curent
de sine Selectează nodul curent

6 Expresii căi de eșantionare

Calea locației poate fi absolută sau relativă. O cale de locație absolută începe cu o bară oblică (/), dar o cale relativă nu. În ambele cazuri, calea de eșantionare constă din unul sau mai mulți pași separați prin bare oblice:

Calea locației absolute:

/pas/pas/...

Cale de preluare a locației relative:

Pas/pas/...

Fiecare pas este evaluat în raport cu nodurile din setul de noduri curent. Pasul consta in:

  • axa (definește relația arborescentă dintre nodurile selectate și nodul curent);
  • verificare nod (identifică un nod în cadrul unei axe);
  • zero sau mai multe predicate (pentru a rafina și mai mult setul de noduri selectat)

Sintaxa pasului de preluare este:

Axisname::nodetestAxisname::nodetest[predictor]

Exemplu Rezultat
copil::carte Selectează toate nodurile de carte care sunt copii ale nodului curent
atribut::lang Selectează atributul de limbă (lang) al nodului curent
copil::* Selectează toți copiii nodului curent
atribut::* Selectează toate atributele nodului curent
copil::text() Selectează toate nodurile de text ale nodului curent
copil::nod() Selectează toți copiii imediati ai nodului curent
descendent::carte Selectează toți copiii nodului curent
strămoș::carte Selectează toți strămoșii „cărților” nodului curent
strămoș sau sine::carte Selectează toți strămoșii de carte ai nodului curent - și nodul curent dacă este și o carte
copil::*/copil::pret Selectează toți copiii de „preț” la un nivel distanță de nodul curent

7 Operatori XPath

Expresiile XPath revin ca un set de noduri, șiruri, booleeni sau valori numerice. Mai jos este o listă de operatori utilizați în expresiile XPath:

Operator Descriere Exemplu
| Calculează două seturi de noduri //carte | //CD
+ Plus 6 + 4
- Scădere 6 - 4
* Multiplicare 6 * 4
div Divizia 8 div 4
= Egalitatea pret=9,80
!= Inegalitate pret!=9,80
< Mai puțin decât Preț<9.80
<= Mai puțin sau egal pret≤9,80
> Mai mult decât pret>9,80
>= Mai mult sau egal pret≤9,80
sau Sau preț=9,80 sau preț=9,70
și ȘI pret>9,00 si pret<9.90
mod Restul diviziei 5 mod 2

8 Exemple XPath

Să trecem prin sintaxa XPath de bază cu câteva exemple. Vom folosi următorul document XML „books.xml” în exemplele de mai jos:

Italiană de zi cu zi Giada De Laurentiis 2005 30.00 Harry Potter JK Rowling 2005 29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Învățarea XML Erik T. Ray 2003 39.95

Încărcarea unui document XML

Utilizați XMLHttpRequest pentru a descărca documente XML, care este acceptat de majoritatea browserelor moderne:

Var xmlhttp=new XMLHttpRequest()

Cod pentru browserele vechi Microsoft (IE 5 și 6):

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

Selectarea nodului

Din păcate, XPath poate funcționa diferit în Internet Explorer decât în ​​alte browsere. În exemplele noastre vom folosi cod care ar trebui să funcționeze în majoritatea browserelor. Internet Explorer folosește metoda „selectNodes()” pentru a selecta nodurile dintr-un document XML:

XmlDoc.selectNodes(xpath);

Firefox, Chrome, Opera și Safari folosesc metoda evaluate() pentru a selecta noduri dintr-un document XML:

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

Selectați toate titlurile

Următorul exemplu selectează toate nodurile antet:

/librărie/carte/titlu

Alegerea titlului primei cărți

Următorul exemplu selectează titlul primului nod „carte” după elementul „librărie”:

/librărie/carte/titlu

Selectați toate prețurile

Următorul exemplu selectează textul tuturor nodurilor de preț:

/librărie/carte/preț

Selectează noduri cu preț >35

Următorul exemplu selectează toate nodurile cu prețuri peste 35:

/librărie/carte/preț

Selectarea nodurilor de antet cu preț >35

Următorul exemplu selectează toate nodurile de titlu cu un preț mai mare de 35:

/librărie/carte/titlu

XPath este un limbaj de interogare pentru elementele de document xml sau xhtml. La fel ca SQL, xpath este un limbaj de interogare declarativ. Pentru a obține datele de interes, trebuie doar să creați o interogare care să descrie aceste date. Interpretul de limbă xpath va face toată munca murdară pentru tine.
Foarte convenabil, nu-i așa? Să vedem ce capabilități oferă xpath pentru accesarea nodurilor paginii web.

Crearea unei cereri către nodurile paginii web

Vă aduc în atenție o mică lucrare de laborator, în cadrul căreia voi demonstra crearea de solicitări xpath către o pagină web. Vei putea repeta cererile pe care le-am dat și, cel mai important, vei încerca să le îndeplinești pe ale tale. Sper că datorită acestui lucru, articolul va fi la fel de interesant pentru începători și programatori familiarizați cu xpath to xml.

Pentru laborator vom avea nevoie de:
- pagina web xhtml;
- Browser Mozilla Firefox cu suplimente;
- firebug;
- firePath;
(puteți folosi orice alt browser cu suport vizual xpath)
- un pic de timp.

Ca pagină web pentru realizarea unui experiment, propun pagina principală a site-ului World Wide Web Consortium ("http://w3.org"). Această organizație este cea care dezvoltă limbajele xquery(xpath), specificația xhtml și multe alte standarde de internet.

Sarcină
Preluați informații despre conferințele consorțiului din codul xhtml al paginii principale w3.org folosind interogări xpath.
Să începem să scriem interogări xpath.
Prima solicitare XPat
Deschideți fila Firepath în FireBug, selectați elementul de analizat cu selectorul, faceți clic pe: Firepath a creat o solicitare xpath pentru elementul selectat.

Dacă ați selectat titlul primului eveniment, atunci cererea va fi astfel:

După eliminarea indecșilor care nu sunt necesari, interogarea se va potrivi cu toate elementele de tip antet.

Firepath evidențiază elementele care se potrivesc cu interogarea. Puteți vedea în timp real care noduri de document se potrivesc cu interogarea.

Cerere de informații despre locațiile conferinței:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Iată cum obținem o listă de sponsori:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

sintaxa xpath

Să ne întoarcem la interogările pe care le-am creat și să înțelegem cum sunt structurate.
Să luăm în considerare prima cerere în detaliu

În această interogare am împărțit trei părți pentru a demonstra capabilitățile xpath. (Diviziunea în părți este dificilă)

Prima parte
.// - coborâre recursivă la zero sau mai multe niveluri de ierarhie din contextul actual. În cazul nostru, contextul actual este rădăcina documentului

A doua parte
* - orice element,
[@id="w3c_home_upcoming_events"]– un predicat pe baza căruia căutăm un nod care are un atribut id egal cu „w3c_home_upcoming_events”. ID-urile elementelor XHTML trebuie să fie unice. Prin urmare, interogarea „orice element cu un anumit ID” ar trebui să returneze singurul nod pe care îl căutăm.

Putem înlocui * la numele exact al nodului divîn această cerere
div[@id="w3c_home_upcoming_events"]

Astfel, coborâm în arborele documentului la nodul div[@id="w3c_home_upcoming_events"] de care avem nevoie. Nu ne interesează deloc în ce noduri constă arborele DOM și câte niveluri de ierarhie rămân deasupra.

A treia parte
/ul/li/div/p/a–xpath este calea către un anumit element. Calea constă în pași de adresare și condiții de verificare a nodurilor (ul, li etc.). Pașii sunt separați de un caracter „/” (slash).

colecții xpath
Nu este întotdeauna posibil să accesați nodul de interes folosind un predicat sau pași de adresare. Foarte des există multe noduri de același tip la un nivel de ierarhie și este necesar să selectați noduri „doar primul” sau „doar al doilea”. În astfel de cazuri sunt oferite colecții.

colecțiile xpath vă permit să accesați un element prin indexul său. Indicii corespund ordinii în care au fost prezentate elementele în documentul original. Numărul de serie din colecții se numără de la unu.

Pe baza faptului că „locul” este întotdeauna al doilea paragraf după „numele conferinței”, obținem următoarea interogare:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Unde p este al doilea element din mulțime pentru fiecare nod din listă /ul/li/div.

În mod similar, putem obține o listă de sponsori cu cererea:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Unele funcții xpath
Există multe funcții în xpath pentru a lucra cu elemente dintr-o colecție. Voi da doar câteva dintre ele.

ultimul():
Returnează ultimul element al colecției.
Interogarea ul/li/div/p - va returna ultimele paragrafe pentru fiecare nod al listei „ul”.
Funcția first() nu este furnizată. Pentru a accesa primul element, utilizați indexul „1”.

text():
Returnează conținutul de testare al unui element.
.//a – primim toate linkurile cu textul „Arhivă”.

poziție() și mod:
position() - returnează poziția unui element dintr-o mulțime.
mod este restul diviziei.

Prin combinarea acestor funcții putem obține:
- nici măcar elemente ul/li
- elemente pare: ul/li

Operații de comparație

  • < - логическое «меньше»
  • > - logic „mai mare decât”
  • <= - логическое «меньше либо равно»
  • >= - logic „mai mare sau egal”
ul/li , ul/li - listează elemente începând de la al 3-lea număr și invers.

Pe cont propriu

Incearca sa obtii:
- chiar și link-uri URL din meniul din stânga „Standarde”;
- anteturile tuturor știrilor, cu excepția primei de pe pagina principală a w3c.org.

XPath în PHP5

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

In cele din urma

Folosind un exemplu simplu, am văzut capabilitățile xpath pentru accesarea nodurilor paginii web.
Xpath este standardul industrial pentru accesarea elementelor xml și transformărilor xhtml, xslt.
Îl puteți folosi pentru a analiza orice pagină html. Dacă codul html sursă conține erori semnificative în marcaj, rulați-l

Astăzi vom arunca o privire mai atentă asupra subiectului utilizării XPath cu PHP. Veți vedea în exemple cum XPath reduce semnificativ cantitatea de cod. Să ne uităm la utilizarea interogărilor și funcțiilor în XPath.

La început, vă voi pune la dispoziție două tipuri de documente: DTD și XML, cu ajutorul cărora ne vom uita la funcționarea PHP DOM XPath. Iată cum arată ele:

O carte Un autor Groază capitol unul O altă Carte Un alt Autor Operă științifico-fantastică capitol unul

Interogări de bază XPath

Sintaxa simplă XPath vă permite să accesați elemente dintr-un document XML. În cel mai simplu mod, puteți specifica calea către elementul dorit. Folosind documentul XML furnizat mai sus, următoarea interogare XPath va returna colecția elementelor curente găsite în elementul carte:

//biblioteca/carte

Ca aceasta! Două bare oblice definesc elementul rădăcină al documentului, iar o bară oblică înaintează tranzițiile la elementul secundar al cărții. Este simplu și rapid, nu-i așa?

Dar ce se întâmplă dacă doriți să selectați un anumit element de carte dintr-un set? Să presupunem că doriți cărți ale unui „Anumit autor”. Interogarea XPath pentru aceasta ar fi:

//biblioteca/carte/autor/..

poți să folosești text()între paranteze drepte pentru a compara valoarea nodului. De asemenea «/..» înseamnă că vrem să folosim elementul părinte (adică să revenim cu un nod mai sus).

Interogările XPath se fac folosind una sau două funcții: interogare()Și a evalua(). Ambele formează o cerere, dar diferența este în rezultatul returnat. query() va reveni întotdeauna DOMNodeList, Spre deosebire de a evalua() va returna un rezultat text, dacă este posibil. De exemplu, dacă interogarea XPath ar returna numărul de cărți scrise de un anumit autor, atunci query() ar returna un DOMNodeList gol, evaluate() ar returna pur și simplu un număr, îl puteți folosi direct pentru a prelua datele din nod. .

Cod XPath și beneficii de viteză

Să ne uităm la un exemplu simplu care va returna numărul de cărți scrise de un anumit autor. Vom privi prima metodă așa cum o facem întotdeauna, fără a folosi XPath. Acum veți înțelege cum să faceți acest lucru fără XPath și cât de ușor este să o faceți cu XPath.

domDocument->getElementsByTagName("autor"); foreach ($elemente ca $element) ( if ($element->nodeValue == $autor) ( $total++; ) ) returnează $număr; )

Următoarea metodă returnează același rezultat, dar folosește XPath pentru a selecta acele cărți care sunt scrise de un anumit autor.

domDocument); $rezultat = $xpath->interogare($interogare); returnează $rezultat->lungime; )

Rețineți că nu trebuie să verificăm din nou valoarea fiecărui element pentru a determina care autor a scris fiecare carte. Dar putem simplifica mai mult codul folosind funcția XPath numara() pentru a număra conținutul elementelor din această cale.

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

Putem obține informațiile de care avem nevoie cu o singură interogare XPath. Nu este nevoie să creați multe filtre PHP. Acesta este cel mai simplu și rapid mod de a scrie această funcționalitate!

Rețineți că evaluate() a fost folosit în ultimul exemplu. Acest lucru se datorează faptului că funcția count() returnează un rezultat text. Folosind query() va returna un DOMNodeList, dar va fi gol.

XPath merită folosit, deoarece nu numai că vă simplifică codul PHP, ci oferă și un avantaj al vitezei. Am observat că prima versiune a fost cu 30% mai rapidă în medie comparativ cu a doua. Dar al treilea este cu 10% mai rapid decât primul. Desigur, acest lucru depinde de serverul dvs. și de interogările pe care le utilizați. Utilizarea XPath în forma sa pură oferă cele mai bune rezultate în ceea ce privește viteza și ușurința de scriere a codului.

Funcții XPath

Iată câteva funcții care pot fi utilizate cu XPath. Veți găsi, de asemenea, o mulțime de resurse care intră în detaliu despre fiecare caracteristică disponibilă. Dacă trebuie să calculați DOMNodeList sau să comparați nodeValue (valoarea nodului), puteți găsi o funcție XPath potrivită care elimină utilizarea codului PHP inutil.

Știți deja acest lucru din exemplul funcției count(). Să folosim funcția id() pentru a obține titlurile cărților cu codurile ISBN date. Pentru a face acest lucru, trebuie să utilizați următoarea expresie XPath:

id(„isbn1234 isbn1235”)/titlu

Rețineți că valorile pe care le căutați nu trebuie să fie incluse în paranteze, ci doar separate prin spații. De asemenea, nici nu vă gândiți să adăugați o virgulă:

domDocument); $rezultat = $xpath->interogare($interogare); $carti = array(); foreach ($rezultat ca $nod) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) return $carti; )

Gestionarea funcțiilor complexe în XPath este incredibil de simplă.

Utilizarea funcțiilor PHP cu XPath

Uneori veți avea nevoie de mai multe funcționalități pe care funcțiile standard XPath nu le pot oferi. Din fericire, PHP DOM permite funcțiilor PHP native să interacționeze cu interogările XPath.

Să ne uităm la un exemplu care returnează numărul de cuvinte dintr-un titlu de carte. În această funcție cea mai simplă, vom scrie următoarele:

domDocument); $rezultat = $xpath->interogare($interogare); $titlu = $result->item(0)->getElementsByTagName("titlu") ->item(0)->nodeValue; returnează str_număr_cuvinte($titlu); )

Dar, putem include și funcția str_word_count() direct în cererea XPath. Acest lucru se poate face în câțiva pași. În primul rând, trebuie să înregistrăm spațiul de nume cu un obiect XPath. Funcțiile PHP din cererile XPath sunt apelate folosind șirul „php:functionString”, după care se scrie numele funcției dorite. De asemenea, spațiul de nume este discutat mai detaliat la http://php.net/xpath. Alte valori ale spațiului de nume vor genera o eroare. După aceasta, trebuie să apelăm registerPHPFunctions(). Această funcție îi spune PHP că atunci când se face un apel prin spațiul de nume „php:”, PHP se va ocupa de acest apel.

Un exemplu de sintaxă pentru apelarea funcțiilor ar fi:

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

Să punem totul împreună în următorul exemplu de funcție getNumberOfWords():

domDocument); //register php namespace $xpath->registerNamespace("php", "http://php.net/xpath"); //acum funcțiile php pot fi apelate în cererile xpath $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))"; return $xpath->evaluate($interogare); )

Rețineți că nu trebuie să apelați funcția XPath text() pentru a obține textul nodului. Metoda registerPHPFunctions() face acest lucru automat. Deși, următorul exemplu de linie de cod va fi, de asemenea, validă:

php:functionString("str_word_count",(//biblioteca/carte[@isbn = "$isbn"]/titlu))

Înregistrarea funcțiilor PHP nu se limitează la funcțiile care sunt incluse în PHP. Puteți să vă definiți propriile funcții și să le utilizați în XPath. Singura diferență este că va trebui să utilizați „php:function” în loc de „php:functionString”.

Să scriem o funcție în afara clasei pentru a demonstra funcționalitatea de bază. Funcția pe care o vom folosi returnează cărțile autorului „George Orwell”. Ar trebui să returneze true pentru fiecare nod pe care doriți să îl includeți în interogare.

nodeValue == „George Orwell"; } !}

Argumentul care este transmis funcției este o matrice de elemente DOM. Această funcție trece prin matrice și determină elementele necesare, apoi le include în DOMNodeList. În acest exemplu, nodul testat a fost /book și am folosit și /author pentru a determina elementele necesare.

Acum putem crea funcția getGeorgeOrwellBooks():

domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $interogare = "//biblioteca/carte1"; $rezultat = $xpath->interogare($interogare); $carti = array(); foreach($rezultat ca $nod) ( $books = $node->getElementsByTagName("titlu") ->item(0)->nodeValue; ) return $carti; )

Dacă funcția compare() este statică, atunci trebuie să modificați interogarea XPath:

//biblioteca/carte

Sincer să fiu, toată această funcționalitate ar fi putut fi implementată folosind cod pur XPath. Dar exemplul arată cum puteți extinde interogările XPath și le puteți face mai complexe.

În concluzie

XPath este o modalitate excelentă de a reduce cantitatea de cod și de a crește procesarea acestuia atunci când lucrați cu XML. Funcționalitatea suplimentară PHP DOM vă permite să extindeți funcțiile XPath. Acesta este un lucru cu adevărat util, dacă îl utilizați și vă aprofundați în specific, va trebui să scrieți din ce în ce mai puțin cod.


XPath utilizează expresii de cale pentru a selecta noduri dintr-un document XML sau dintr-un set de noduri. Prin nod de-a lungul căii (cale) sau trepte (pași) până la cea selectată.

documente XML de instanță

Vom folosi acest document XML în exemplele de mai jos.


Harry Potter
29.99


Învățarea XML
39.95

Selectați nodul

XPath utilizează expresii de cale pentru a selecta nodurile dintr-un document XML. Sau de-a lungul căii printr-un nod pentru a selecta un pas. Următoarele sunt cele mai utile expresii de cale:

În tabelul de mai jos arătăm câteva dintre căile de expresie și rezultatul expresiei:

expresie Calearezultat
magazin de carteSelectați toate nodurile secundare ale elementului carte.
/ Librărie

Selectați librăria elementului rădăcină.

Notă: Dacă o cale începe cu o bară oblică (/), calea este întotdeauna reprezentativă pentru calea absolută a elementului!

librărie/carteSelectați subarticolele care aparțin librăriei toate articolele de carte.
// CarteSelectați toate subelementele cărții, indiferent de poziția lor în document.
librărie // carteSelectează toate elementele de carte care nu sunt descendenți ai librăriei elementului, indiferent de poziția lor în și sub librărie.
// @LangSelectați toate proprietățile numite Lang.

Predicat(e)

Un predicat este folosit pentru a găsi un anumit nod sau nod care conține valoarea specificată.

Predicatul este cuprins între paranteze drepte.

În tabelul de mai jos, am enumerat câteva expresii de cale cu predicate și rezultatul expresiei:

expresie Calearezultat
/ Librărie / carteSelectați subelementele care aparțin primului element din registru de lucru.
/Librărie/carte [ultimul()]Selectați subelementele care aparțin elementului din ultima carte.
/ Librărie / carte [ultima () - 1]Selectați subarticolele legate de librăria comună a celui de-al doilea articol de carte.
/Librărie/carte [poziție()<3] Selectați primele două elemente de carte ale elementului de carte aparținând subelementelor.
// Titlu [@lang]Selectați tot atributul numit Lang are un titlu de element.
// Titlu [@ LANG = "eng"]Selectați toate numele elementelor și aceste elemente au valoarea atributului în limba engleză.
/librărie/carteSelectați toate elementele de carte ale elementului de carte și valoarea elementului de preț, care trebuie să fie mai mare de 35,00.
/librărie/carte/titluSelectați toate elementele antetului elementului de carte ale elementului de carte și în care valoarea elementului de preț trebuie să fie mai mare de 35,00.

Selectați noduri necunoscute

Caracterele metalice XPath pot fi folosite pentru a selecta elemente XML necunoscute.

În tabelul de mai jos, am enumerat câteva expresii de cale, precum și rezultatele acestor expresii:

Alegeți mai multe căi

Folosind expresia cale „|” operator, puteți alege mai multe căi.

În tabelul de mai jos, am enumerat câteva expresii de cale, precum și rezultatele acestor expresii.