Skrátená syntax XPath. Príklady xpath dotazov na html Pomocou nasledujúcej osi

XPath sa používa na navigáciu medzi prvkami a atribútmi dokumentu XML. XPath je jedným zo základných prvkov štandardu W3C XSLT.

1 Čo sa stalo XPath

výrazy XPath

XPath používa výrazy cesty na výber jednotlivých uzlov alebo množiny uzlov v dokumente XML. Tieto výrazy sú veľmi podobné výrazom, ktoré vidíte pri práci s tradičným počítačovým súborovým systémom.

Štandardné funkcie XPath

XPath obsahuje viac ako 100 vstavaných funkcií. Existujú funkcie pre reťazcové a číselné hodnoty, dátum a čas, porovnávanie uzlov a manipuláciu s QName, správu sekvencií, booleovské hodnoty a oveľa viac.

XPath sa používa v XSLT

XPath je jedným zo základných prvkov štandardu XSLT. Bez znalosti XPath nebudete môcť vytvárať XSLT dokumenty.

2 Terminológia XPath

Uzly

V XPath je sedem typov uzlov: element, atribút, text, menný priestor, pokyny na spracovanie, komentáre a uzly dokumentu. XML dokumenty sú spracované ako stromy uzlov. Vrchný prvok stromu sa nazýva koreňový prvok. Pozrite si nasledujúci dokument XML:

Harry Potter J. K. Rowlingová 2005 29.99

Príklady uzlov v dokumente XML vyššie:

(koreňový prvok) J. K. Rowlingová (uzol) lang="en"(atribút)

Atómové hodnoty

Atómové hodnoty sú uzly, ktoré nemajú deti ani rodičov. Príklad atómových hodnôt:

J. K. Rowling "en"

Prvky

Prvky sú atómové hodnoty alebo uzly.

3 Vzťah uzly

Rodič

Každý prvok a atribút má jedného rodiča. V nasledujúcom príklade je prvok knihy rodičom prvkov názvu, autora, roku a ceny:

Harry Potter J. K. Rowlingová 2005 29.99

Potomkovia

Uzly prvkov môžu mať nula, jeden alebo viac potomkov. V nasledujúcom príklade sú všetky prvky „názov“, „autor“, „rok“ a „cena“ potomkami prvku kniha:

Harry Potter J. K. Rowlingová 2005 29.99

Prvky rovnakej úrovne

Sú to uzly, ktoré majú rovnakého rodiča. V nasledujúcom príklade sú prvky „title“, „autor“, „year“ a „price“ všetky prvky rovnakej úrovne:

Harry Potter J. K. Rowlingová 2005 29.99

Predkovia

Rodič uzla, rodič rodiča uzla atď. V nasledujúcom príklade sú predkami prvku title prvky knihy a kníhkupectva:

Harry Potter J. K. Rowlingová 2005 29.99

Potomkovia

Deti uzla, deti potomkov uzla atď. V nasledujúcom príklade sú potomkami prvku „kníhkupectvo“ prvky „kniha“, „názov“, „autor“, „rok“ a „cena“:

Harry Potter J. K. Rowlingová 2005 29.99

4 Syntax XPath

XPath používa výrazy cesty na výber uzlov alebo sád uzlov v dokumente XML. Uzol je možné vybrať sledovaním cesty alebo krokmi. V nižšie uvedených príkladoch použijeme nasledujúci dokument XML.

Harry Potter 29.99 Učenie XML 39.95

Výber uzla

Použitím výrazov XPath na výber uzlov v dokumente XML môžete vybrať uzol podľa cesty alebo krokov. Najužitočnejšie výrazy cesty sú uvedené nižšie:

V tabuľke nižšie sú uvedené niektoré cesty výrazov a výsledok vykonania výrazu:

výraz XPath Výsledok
kníhkupectvo Vyberie všetky uzly s názvom "kníhkupectvo"
/kníhkupectvo Vyberie koreňový prvok kníhkupectva

Poznámka: Ak cesta začína lomkou (/), je to vždy absolútna cesta k prvku!

kníhkupectvo/kniha Vyberie všetky prvky „kniha“, ktoré sú potomkami prvku „kníhkupectvo“.
//kniha Vyberie všetky prvky „knihy“ bez ohľadu na to, kde sa v dokumente nachádzajú
kníhkupectvo//kniha Vyberie všetky prvky „kniha“, ktoré sú potomkami prvku „knihkupectvo“, bez ohľadu na to, kde sa nachádzajú pod prvkom „kníhkupectvo“
//@lang Vyberie všetky atribúty s názvom „lang“

Predikáty

Predikáty sa používajú na nájdenie konkrétneho uzla alebo uzla, ktorý obsahuje konkrétnu hodnotu. Predikáty sú vždy ohraničené hranatými zátvorkami. V tabuľke nižšie sú uvedené niektoré výrazy cesty s predikátmi a výsledok výrazu:

výrazy XPath Výsledok
/knihkupectvo/kniha Vyberie prvý prvok „kniha“, ktorý je potomkom prvku „kníhkupectvo“.

Poznámka: V IE 5,6,7,8,9 má prvý uzol index , ale podľa smerníc W3C je . Ak chcete vyriešiť tento problém v IE, nastavte možnosť „SelectionLanguage“ pre XPath:

V JavaScripte: xml.setProperty("SelectionLanguage", "XPath");
/knihkupectvo/kniha Vyberie posledný prvok „kniha“, ktorý je potomkom prvku „kníhkupectvo“.
/knihkupectvo/kniha Vyberie predposledný prvok „kniha“, ktorý je potomkom prvku „kníhkupectvo“.
/knihkupectvo/kniha Výber prvých dvoch prvkov „kniha“, ktoré sú potomkami prvku „kníhkupectvo“.
//title[@lang] Vyberie všetky prvky „title“, ktoré majú atribút s názvom „lang“
//title[@lang="en"] Vyberie všetky prvky „title“, ktoré majú atribút „language“ s hodnotou „en“
/knihkupectvo/kniha Vyberie všetky prvky „kniha“ za prvkom „kníhkupectvo“, ktoré majú prvok „cena“ s hodnotou väčšou ako 35,00
/knihkupectvo/kniha/titul Vyberie všetky prvky „názov“ knihy prvku „kníhkupectvo“, ktoré majú prvok „cena“ s hodnotou väčšou ako 35,00

Výber neznámych uzlov

Špeciálne znaky XPath možno použiť na výber neznámych uzlov XML.

V tabuľke nižšie uvádzame niektoré cesty výrazov a výsledky výrazov:

Výber viacerých ciest

Pomocou operátora | vo výrazoch XPath môžete vybrať viacero ciest. V tabuľke nižšie je uvedených niekoľko výrazov cesty a ich výsledkov:

5 Nápravy XPath

Ďalej v príklade použijeme nasledujúci dokument XML.

Harry Potter 29.99 Učenie XML 39.95

Osi definujú množiny uzlov relatívne k aktuálnemu uzlu.

Názov osi Výsledok
predok Vyberie všetkých predkov (rodičov, starých rodičov atď.) aktuálneho uzla
predok-alebo-ja Vyberie všetkých predkov (rodičov, starých rodičov atď.) aktuálneho uzla a samotného aktuálneho uzla
atribút
dieťa
potomok Vyberie všetky deti (deti, vnúčatá atď.) aktuálneho uzla
potomok-alebo-ja Vyberie všetky deti (deti, vnúčatá atď.) aktuálneho uzla a samotný aktuálny uzol
nasledujúce Po zatvorení značky aktuálneho uzla vyberie všetko v dokumente
nasledujúci-súrodenec Vyberie všetky uzly rovnakej úrovne za aktuálnym uzlom
menný priestor Vyberie všetky uzly v danom mennom priestore aktuálneho uzla
rodič Vyberie rodiča aktuálneho uzla
predchádzajúce Vyberie všetky uzly, ktoré sa nachádzajú pred aktuálnym uzlom v dokumente, okrem predkov, uzlov atribútov a uzlov priestoru názvov
predchádzajúci-súrodenec Vyberie všetkých súrodencov až po aktuálny uzol
seba Vyberie aktuálny uzol

6 Výrazy vzorkovacie cesty

Cesta umiestnenia môže byť absolútna alebo relatívna. Cesta absolútneho umiestnenia začína lomkou (/), ale relatívna cesta nie. V oboch prípadoch vzorkovacia cesta pozostáva z jedného alebo viacerých krokov oddelených lomkami:

Cesta absolútnej polohy:

/krok/krok/...

Cesta načítania relatívnej polohy:

Krok/krok/...

Každý krok sa vyhodnocuje oproti uzlom v aktuálnej množine uzlov. Krok pozostáva z:

  • os (definuje stromový vzťah medzi vybranými uzlami a aktuálnym uzlom);
  • kontrola uzla (identifikuje uzol v rámci osi);
  • nula alebo viac predikátov (na ďalšie spresnenie vybranej množiny uzlov)

Syntax kroku načítania je:

Axisname::nodetestAxisname::nodetest[prediktor]

Príklad Výsledok
dieťa::kniha Vyberie všetky uzly knihy, ktoré sú potomkami aktuálneho uzla
atribút::lang Vyberie atribút jazyka (lang) aktuálneho uzla
dieťa::* Vyberie všetkých potomkov aktuálneho uzla
atribút::* Vyberie všetky atribúty aktuálneho uzla
dieťa::text() Vyberie všetky textové uzly aktuálneho uzla
dieťa::node() Vyberie všetkých bezprostredných potomkov aktuálneho uzla
potomok::kniha Vyberie všetkých potomkov aktuálneho uzla
predok::kniha Vyberie všetkých predkov "kníh" aktuálneho uzla
predok-alebo-ja::kniha Vyberie všetkých knižných predkov aktuálneho uzla - a aktuálny uzol, ak je to tiež kniha
dieťa::*/dieťa::cena Vyberie všetky potomky "ceny" o jednu úroveň ďalej od aktuálneho uzla

7 Operátori XPath

Výrazy XPath sa vracajú ako množina uzlov, reťazcov, boolovských hodnôt alebo číselných hodnôt. Nižšie je uvedený zoznam operátorov používaných vo výrazoch XPath:

Operátor Popis Príklad
| Vypočíta dve sady uzlov //kniha | //cd
+ Doplnenie 6 + 4
- Odčítanie 6 - 4
* Násobenie 6 * 4
div divízie 8 diel 4
= Rovnosť cena = 9,80
!= Nerovnosť cena! = 9,80
< Menej ako cena<9.80
<= Menej alebo rovnaké cena≤9,80
> Viac ako cena>9,80
>= Viac alebo rovnaké cena≤9,80
alebo Alebo cena=9,80 alebo cena=9,70
a A cena>9,00 a cena<9.90
mod Zvyšok divízie 5 mod 2

8 Príklady XPath

Prejdime si základnú syntax XPath s niekoľkými príkladmi. V nižšie uvedených príkladoch použijeme nasledujúci dokument XML „books.xml“:

Každodenná taliančina Giada de Laurentiis 2005 30.00 Harry Potter J. K. Rowlingová 2005 29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Učenie XML Erik T. Ray 2003 39.95

Načítavanie dokumentu XML

Na stiahnutie dokumentov XML použite XMLHttpRequest, ktorý je podporovaný väčšinou moderných prehliadačov:

Var xmlhttp=new XMLHttpRequest()

Kód pre staršie prehliadače Microsoft (IE 5 a 6):

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

Výber uzla

Bohužiaľ, XPath môže v Internet Exploreri fungovať inak ako v iných prehliadačoch. V našich príkladoch použijeme kód, ktorý by mal fungovať vo väčšine prehliadačov. Internet Explorer používa metódu "selectNodes()" na výber uzlov v dokumente XML:

XmlDoc.selectNodes(xpath);

Firefox, Chrome, Opera a Safari používajú metódu vyhodnotiť() na výber uzlov z dokumentu XML:

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

Vyberte všetky tituly

Nasledujúci príklad vyberie všetky uzly hlavičky:

/knihkupectvo/kniha/titul

Výber názvu prvej knihy

Nasledujúci príklad vyberie názov prvého uzla „kniha“ za prvkom „kníhkupectvo“:

/knihkupectvo/kniha/titul

Vyberte všetky ceny

Nasledujúci príklad vyberie text všetkých cenových uzlov:

/knihkupectvo/kniha/cena

Vyberie uzly s cenou >35

Nasledujúci príklad vyberie všetky uzly s cenami nad 35:

/knihkupectvo/kniha/cena

Výber uzlov hlavičky s cenou >35

Nasledujúci príklad vyberie všetky uzly titulov s cenou vyššou ako 35:

/knihkupectvo/kniha/titul

Xpath je dopytovací jazyk pre prvky dokumentu xml alebo xhtml. Rovnako ako SQL, aj xpath je deklaratívny dopytovací jazyk. Ak chcete získať údaje, ktoré vás zaujímajú, stačí vytvoriť dotaz, ktorý tieto údaje popisuje. Tlmočník jazyka xpath urobí všetku špinavú prácu za vás.
Veľmi pohodlné, nie? Pozrime sa, aké možnosti ponúka xpath pre prístup k uzlom webovej stránky.

Vytvorenie požiadavky na uzly webovej stránky

Dávam do pozornosti malú laboratórnu prácu, počas ktorej predvediem vytváranie xpath požiadaviek na webovú stránku. Budete môcť zopakovať prosby, ktoré som dal a čo je najdôležitejšie, pokúsiť sa splniť svoje vlastné. Dúfam, že vďaka tomu bude článok rovnako zaujímavý pre začiatočníkov a programátorov znalých xpath to xml.

Pre laboratórium budeme potrebovať:
- xhtml webová stránka;
- prehliadač Mozilla Firefox s doplnkami;
- ohnivák;
- firePath;
(môžete použiť akýkoľvek iný prehliadač s podporou visual xpath)
- trochu času.

Ako webovú stránku na vykonanie experimentu navrhujem hlavnú stránku webovej stránky World Wide Web Consortium ("http://w3.org"). Je to táto organizácia, ktorá vyvíja jazyky xquery(xpath), špecifikáciu xhtml a mnoho ďalších internetových štandardov.

Úloha
Získajte informácie o konferenciách konzorcia z xhtml kódu hlavnej stránky w3.org pomocou dotazov xpath.
Začnime písať xpath dotazy.
Prvá žiadosť Xpath
Otvorte kartu Firepath vo FireBug, pomocou selektora vyberte prvok, ktorý chcete analyzovať, kliknite na: Firepath vytvoril požiadavku xpath pre vybratý prvok.

Ak ste vybrali názov prvej udalosti, požiadavka bude vyzerať takto:

Po odstránení nepotrebných indexov bude dotaz zodpovedať všetkým prvkom typu hlavičky.

Firepath zvýrazní prvky, ktoré zodpovedajú dopytu. V reálnom čase môžete vidieť, ktoré uzly dokumentu zodpovedajú dopytu.

Žiadosť o informácie o mieste konania konferencie:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Takto získame zoznam sponzorov:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

xpath syntax

Vráťme sa k dotazom, ktoré sme vytvorili, a pochopme, ako sú štruktúrované.
Pozrime sa podrobne na prvú žiadosť

V tomto dotaze som rozdelil tri časti, aby som demonštroval schopnosti xpath. (Rozdelenie na časti je zložité)

Prvá časť
.// - rekurzívny zostup na nulu alebo viac úrovní hierarchie z aktuálneho kontextu. V našom prípade je aktuálny kontext koreň dokumentu

Druhá časť
* - akýkoľvek prvok,
[@id="w3c_home_upcoming_events"]– predikát, na základe ktorého hľadáme uzol, ktorý má atribút id rovný „w3c_home_upcoming_events“. ID prvkov XHTML musia byť jedinečné. Preto by dotaz „akýkoľvek prvok so špecifickým ID“ mal vrátiť jediný uzol, ktorý hľadáme.

Môžeme nahradiť * na presný názov uzla div v tejto žiadosti
div[@id="w3c_home_upcoming_events"]

Prejdeme teda nadol v strome dokumentov k uzlu div[@id="w3c_home_upcoming_events"], ktorý potrebujeme. Vôbec nás nezaujíma, z akých uzlov sa skladá strom DOM a koľko úrovní hierarchie zostáva vyššie.

Tretia časť
/ul/li/div/p/a–xpath je cesta ku konkrétnemu prvku. Cesta pozostáva z krokov adresovania a podmienok kontroly uzla (ul, li, atď.). Kroky sú oddelené znakom "/" (lomka).

zbierky xpath
Nie je vždy možné pristupovať k záujmovému uzlu pomocou predikátu alebo krokov adresovania. Veľmi často existuje veľa uzlov rovnakého typu na jednej úrovni hierarchie a je potrebné vybrať „iba prvý“ alebo „iba druhý“ uzol. Pre takéto prípady sa poskytujú zbierky.

Kolekcie xpath vám umožňujú pristupovať k prvku pomocou jeho indexu. Indexy zodpovedajú poradiu, v akom boli prvky uvedené v pôvodnom dokumente. Poradové číslo v zbierkach sa počíta od jednej.

Na základe skutočnosti, že „miesto konania“ je vždy druhý odsek za „názvom konferencie“, dostaneme nasledujúci dotaz:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Kde p je druhý prvok v množine pre každý uzol v zozname /ul/li/div.

Podobne môžeme získať zoznam sponzorov s požiadavkou:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Niektoré funkcie xpath
V xpath je veľa funkcií na prácu s prvkami v rámci kolekcie. Dám len pár z nich.

posledný():
Vráti posledný prvok kolekcie.
Dotaz ul/li/div/p – vráti posledné odseky pre každý uzol zoznamu „ul“.
Funkcia first() nie je poskytnutá. Na prístup k prvému prvku použite index "1".

text():
Vráti testovací obsah prvku.
.//a – dostaneme všetky odkazy s textom „Archív“.

position() a mod:
position() - vráti pozíciu prvku v množine.
mod je zvyšok divízie.

Kombináciou týchto funkcií môžeme získať:
- ani prvky ul/li
- párne prvky: ul/li

Porovnávacie operácie

  • < - логическое «меньше»
  • > - logické „väčšie ako“
  • <= - логическое «меньше либо равно»
  • >= - logické „väčšie alebo rovné“
ul/li , ul/li - zoznam prvkov od 3. čísla a naopak.

Sám za seba

Skúste získať:
- dokonca aj URL odkazy z ľavého menu „Štandardy“;
- hlavičky všetkých noviniek, okrem prvej z hlavnej stránky w3c.org.

Xpath v PHP5

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

Konečne

Na jednoduchom príklade sme videli možnosti xpath pre prístup k uzlom webovej stránky.
Xpath je priemyselný štandard pre prístup k prvkom xml a xhtml, xslt transformáciám.
Môžete ho použiť na analýzu akejkoľvek html stránky. Ak zdrojový html kód obsahuje významné chyby v označovaní, spustite ho

Dnes sa bližšie pozrieme na tému používania XPath s PHP. V príkladoch uvidíte, ako XPath výrazne znižuje množstvo kódu. Pozrime sa na používanie dotazov a funkcií v XPath.

Na začiatok vám poskytnem dva typy dokumentov: DTD a XML, pomocou ktorých sa pozrieme na fungovanie PHP DOM XPath. Takto vyzerajú:

Kniha Autor Hrôza prvá kapitola Ďalšia kniha Ďalší Autor Sci-fi prvá kapitola

Základné otázky XPath

Jednoduchá syntax XPath umožňuje prístup k prvkom v dokumente XML. Najjednoduchším spôsobom môžete určiť cestu k požadovanému prvku. Pomocou dokumentu XML poskytnutého vyššie nasledujúci dotaz XPath vráti kolekciu aktuálnych prvkov nájdených v prvku knihy:

//knižnica/kniha

Páči sa ti to! Dve lomky definujú koreňový prvok dokumentu a jedna lomka prechádza do podriadeného prvku knihy. Je to jednoduché a rýchle, však?

Ale čo ak chcete vybrať konkrétny knižný prvok zo sady? Predpokladajme, že chcete knihy od „určitého autora“. Dotaz XPath na to by bol:

//knižnica/kniha/autor/..

môžeš použiť text() v hranatých zátvorkách na porovnanie hodnoty uzla. Tiež «/..» znamená, že chceme použiť nadradený prvok (t. j. vrátiť sa o jeden uzol vyššie).

Dotazy XPath sa robia pomocou jednej alebo dvoch funkcií: dopyt() A ohodnotiť(). Oba tvoria požiadavku, ale rozdiel je v vrátenom výsledku. query() sa vždy vráti DOMNodeList, Na rozdiel od ohodnotiť() ak je to možné, vráti textový výsledok. Napríklad, ak by váš dotaz XPath vrátil počet kníh napísaných konkrétnym autorom, potom by query() vrátilo prázdny zoznam DOMNodeList, vyhodnotiť() by jednoducho vrátilo číslo, môžete to použiť priamo na získanie údajov z uzla .

Výhody kódu XPath a rýchlosti

Pozrime sa na jednoduchý príklad, ktorý vráti počet kníh napísaných konkrétnym autorom. Na prvú metódu sa pozrieme tak, ako to robíme vždy, bez použitia XPath. Teraz pochopíte, ako to urobiť bez XPath a o koľko jednoduchšie je to urobiť s XPath.

domDocument->getElementsByTagName("autor"); foreach ($elements ako $element) ( if ($element->nodeValue == $author) ( $total++; ) ) return $cislo; )

Ďalšia metóda vráti rovnaký výsledok, ale používa XPath na výber tých kníh, ktoré sú napísané konkrétnym autorom.

domDocument); $vysledok = $xcesta->dotaz($dotaz); return $vysledok->dlzka; )

Všimnite si, že na určenie toho, ktorý autor napísal jednotlivé knihy, nemusíme znova kontrolovať hodnotu každého prvku. Kód však môžeme ešte viac zjednodušiť pomocou funkcie XPath počítať () spočítať obsah prvkov v tejto ceste.

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

Potrebné informácie môžeme získať pomocou jediného riadkového dotazu XPath. Nie je potrebné vytvárať veľa PHP filtrov. Toto je najjednoduchší a najrýchlejší spôsob, ako napísať túto funkciu!

Všimnite si, že v poslednom príklade bola použitá funkcia value(). Je to preto, že funkcia count() vracia textový výsledok. Použitie query() vráti DOMNodeList, ale ten bude prázdny.

XPath sa oplatí používať, pretože nielenže zjednoduší váš PHP kód, ale ponúka aj výhodu rýchlosti. Všimol som si, že prvá verzia bola v priemere o 30% rýchlejšia v porovnaní s druhou. Ale tretí je o 10% rýchlejší ako prvý. To samozrejme závisí od vášho servera a dopytov, ktoré používate. Použitie XPath v jeho čistej forme poskytuje najlepšie výsledky v rýchlosti a jednoduchosti písania kódu.

Funkcie XPath

Tu je niekoľko funkcií, ktoré možno použiť s XPath. Nájdete tu aj množstvo zdrojov, ktoré sa podrobne venujú každej dostupnej funkcii. Ak potrebujete vypočítať DOMNodeList alebo porovnať nodeValue (hodnota uzla), môžete nájsť vhodnú funkciu XPath, ktorá eliminuje použitie zbytočného PHP kódu.

Už to poznáte z príkladu funkcie count(). Na získanie názvov kníh s danými ISBN použijeme funkciu id(). Ak to chcete urobiť, musíte použiť nasledujúci výraz XPath:

id("isbn1234 isbn1235")/názov

Všimnite si, že hodnoty, ktoré hľadáte, by nemali byť uzavreté v zátvorkách, iba oddelené medzerami. Tiež neuvažujte nad pridaním čiarky:

domDocument); $vysledok = $xcesta->dotaz($dotaz); $knihy = pole(); foreach ($výsledok ako $uzol) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) return $books; )

Ovládanie zložitých funkcií v XPath je neuveriteľne jednoduché.

Používanie funkcií PHP s XPath

Niekedy budete potrebovať viac funkcií, ktoré štandardné funkcie XPath nedokážu poskytnúť. Našťastie PHP DOM umožňuje natívnym funkciám PHP interakciu s dotazmi XPath.

Pozrime sa na príklad, ktorý vráti počet slov v názve knihy. V tejto najjednoduchšej funkcii napíšeme nasledovné:

domDocument); $vysledok = $xcesta->dotaz($dotaz); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; return str_word_count($title); )

Ale môžeme tiež zahrnúť funkciu str_word_count() priamo do požiadavky XPath. Dá sa to urobiť v niekoľkých krokoch. Najprv musíme zaregistrovať menný priestor s objektom XPath. Funkcie PHP v požiadavkách XPath sa volajú pomocou reťazca „php:functionString“, za ktorým sa zapíše názov požadovanej funkcie. Menný priestor je tiež podrobnejšie diskutovaný na http://php.net/xpath. Ostatné hodnoty menného priestoru vyvolajú chybu. Potom musíme zavolať registerPHPFunctions(). Táto funkcia hovorí PHP, že keď sa uskutoční volanie cez menný priestor "php:", PHP toto volanie spracuje.

Príklad syntaxe pre volanie funkcií by bol:

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

Poďme si to všetko dať dokopy v nasledujúcom príklade funkcie getNumberOfWords():

domDocument); //registrácia priestoru názvov php $xpath->registerNamespace("php", "http://php.net/xpath"); //teraz je možné volať funkcie php v požiadavkách xpath $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//knižnica/kniha[@isbn = "$isbn"]/názov))"; return $xpath->evaluate($query); )

Všimnite si, že na získanie textu uzla nemusíte volať funkciu XPath text(). Metóda registerPHPFunctions() to robí automaticky. Aj keď bude platný aj nasledujúci riadok kódu:

php:functionString("str_word_count",(//knižnica/kniha[@isbn = "$isbn"]/názov))

Registrácia funkcií PHP nie je obmedzená na funkcie, ktoré sú súčasťou PHP. Môžete definovať svoje vlastné funkcie a používať ich v XPath. Jediný rozdiel je v tom, že budete musieť použiť "php:function" namiesto "php:functionString".

Napíšme funkciu mimo triedy, aby sme demonštrovali základnú funkcionalitu. Funkcia, ktorú použijeme, vráti knihy od autora „George Orwell“. Mal by vrátiť hodnotu true pre každý uzol, ktorý chcete zahrnúť do dotazu.

nodeValue == "George Orwell"; } !}

Argument, ktorý sa odovzdá funkcii, je pole prvkov DOM. Táto funkcia prechádza cez pole a určuje potrebné prvky a potom ich zahrnie do zoznamu DOMNodeList. V tomto príklade bol testovaný uzol /book a na určenie požadovaných prvkov sme použili aj /author.

Teraz môžeme vytvoriť funkciu getGeorgeOrwellBooks():

domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $dotaz = "//knižnica/kniha1"; $vysledok = $xcesta->dotaz($dotaz); $knihy = pole(); foreach($result as $node) ( $books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) return $books; )

Ak je funkcia Compare() statická, musíte upraviť dotaz XPath:

//knižnica/kniha

Úprimne povedané, všetky tieto funkcie mohli byť implementované pomocou čistého kódu XPath. Ale príklad ukazuje, ako môžete rozšíriť dotazy XPath a urobiť ich zložitejšími.

Na záver

XPath je skvelý spôsob, ako znížiť množstvo kódu a zvýšiť jeho spracovanie pri práci s XML. Dodatočná funkčnosť PHP DOM vám umožňuje rozšíriť funkcie XPath. Toto je naozaj užitočná vec, ak ju využijete a zahĺbite sa do špecifík, budete musieť písať čoraz menej kódu.


XPath používa výrazy cesty na výber uzlov v dokumente XML alebo množine uzlov. Uzlom pozdĺž cesty (cesty) alebo etapy (kroky) k vybranému.

inštancie XML dokumentov

Tento dokument XML použijeme v nižšie uvedených príkladoch.


Harry Potter
29.99


Učenie XML
39.95

Vyberte uzol

XPath používa výrazy cesty na výber uzlov v dokumente XML. Alebo pozdĺž cesty cez uzol a vyberte krok. Nasledujú najužitočnejšie výrazy cesty:

V tabuľke nižšie uvádzame niektoré cesty výrazu a výsledok výrazu:

výraz Cestavýsledok
kníhkupectvoVyberte všetky dcérske uzly prvku knihy.
/ Kníhkupectvo

Vyberte kníhkupectvo koreňového prvku.

Poznámka: Ak cesta začína lomkou (/), cesta vždy predstavuje absolútnu cestu prvku!

kníhkupectvo/knihaVyberte podpoložky patriace do kníhkupectva všetky položky kníh.
// KnihaVyberte všetky čiastkové prvky knihy bez ohľadu na ich polohu v dokumente.
kníhkupectvo // knihaVyberie všetky prvky knihy, ktoré nie sú potomkami kníhkupectva prvku, bez ohľadu na ich polohu v kníhkupectve a pod ním.
// @LangVyberte všetky vlastnosti s názvom Lang.

Predikát(y)

Predikát sa používa na nájdenie konkrétneho uzla alebo uzla, ktorý obsahuje zadanú hodnotu.

Predikát je uzavretý v hranatých zátvorkách.

V tabuľke nižšie sme uviedli niektoré výrazy cesty s predikátmi a výsledok výrazu:

výraz Cestavýsledok
/ Kníhkupectvo / knihaVyberte čiastkové prvky, ktoré patria do prvého prvku zošita.
/Kníhkupectvo/kniha [posledná()]Vyberte čiastkové prvky, ktoré patria k prvku poslednej knihy knihy.
/ Kníhkupectvo / kniha [posledný () - 1]Vyberte podpoložky súvisiace so vzájomným kníhkupectvom druhej knižnej položky.
/Knihkupectvo/kniha [position()<3] Vyberte prvé dva prvky knihy prvku knihy patriace k podprvkom.
// Názov [@lang]Vybrať všetko atribút s názvom Lang má názov prvku.
// Názov [@ LANG = "eng"]Vyberte všetky názvy prvkov a tieto prvky budú mať hodnotu anglického atribútu.
/knihkupectvo/knihaVyberte všetky prvky knihy prvku knihy a hodnotu prvku ceny, ktorá musí byť väčšia ako 35,00.
/knihkupectvo/kniha/titulVyberte všetky prvky hlavičky prvku knihy prvku knihy, v ktorých musí byť hodnota prvku ceny väčšia ako 35,00.

Vyberte neznáme uzly

Zástupné znaky XPath možno použiť na výber neznámych prvkov XML.

V tabuľke nižšie uvádzame niektoré výrazy cesty, ako aj výsledky týchto výrazov:

Vyberte si viacero ciest

Použitie výrazu cesty "|" operátora, môžete si vybrať niekoľko ciest.

V tabuľke nižšie sú uvedené niektoré výrazy cesty, ako aj výsledky týchto výrazov.