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:
Príklady uzlov v dokumente XML vyššie:
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:
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:
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:
Predkovia
Rodič uzla, rodič rodiča uzla atď. V nasledujúcom príklade sú predkami prvku title prvky knihy a kníhkupectva:
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“:
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.
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.
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“:
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é“
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ú:
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.
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 Cesta | výsledok |
---|---|
kníhkupectvo | Vyberte 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/kniha | Vyberte podpoložky patriace do kníhkupectva všetky položky kníh. |
// Kniha | Vyberte všetky čiastkové prvky knihy bez ohľadu na ich polohu v dokumente. |
kníhkupectvo // kniha | Vyberie všetky prvky knihy, ktoré nie sú potomkami kníhkupectva prvku, bez ohľadu na ich polohu v kníhkupectve a pod ním. |
// @Lang | Vyberte 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 Cesta | výsledok |
---|---|
/ Kníhkupectvo / kniha | Vyberte č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/kniha | Vyberte všetky prvky knihy prvku knihy a hodnotu prvku ceny, ktorá musí byť väčšia ako 35,00. |
/knihkupectvo/kniha/titul | Vyberte 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.