Zkrácená syntaxe XPath. Příklady dotazů xpath do html Pomocí následující osy

XPath se používá k navigaci mezi prvky a atributy dokumentu XML. XPath je jedním ze základních prvků standardu W3C XSLT.

1 Co se stalo XPath

Výrazy XPath

XPath používá výrazy cesty k výběru jednotlivých uzlů nebo sady uzlů v dokumentu XML. Tyto výrazy jsou velmi podobné výrazům, které vidíte při práci s tradičním počítačovým souborovým systémem.

Standardní funkce XPath

XPath obsahuje více než 100 vestavěných funkcí. Existují funkce pro řetězcové a číselné hodnoty, datum a čas, porovnání uzlů a manipulaci s QName, správu sekvencí, booleovské hodnoty a mnoho dalšího.

XPath se používá v XSLT

XPath je jedním ze základních prvků standardu XSLT. Bez znalosti XPath nebudete schopni vytvářet dokumenty XSLT.

2 Terminologie XPath

Uzly

V XPath je sedm typů uzlů: element, atribut, text, jmenný prostor, instrukce pro zpracování, komentáře a uzly dokumentu. XML dokumenty jsou zpracovávány jako stromy uzlů. Horní prvek stromu se nazývá kořenový prvek. Podívejte se na následující dokument XML:

Harry Potter J.K.Rowling 2005 29.99

Příklady uzlů v dokumentu XML výše:

(kořenový prvek) J.K.Rowling (uzel) lang="en"(atribut)

Atomové hodnoty

Atomové hodnoty jsou uzly, které nemají děti ani rodiče. Příklad atomových hodnot:

J. K. Rowling "en"

Elementy

Prvky jsou atomické hodnoty nebo uzly.

3 Vztah uzly

Rodič

Každý prvek a atribut má jednoho rodiče. V následujícím příkladu je prvek kniha nadřazeným prvkem prvku název, autor, rok a cena:

Harry Potter J.K.Rowling 2005 29.99

Potomci

Uzly prvků mohou mít nula, jeden nebo více potomků. V následujícím příkladu jsou prvky „title“, „autor“, „year“ a „price“ všechny potomky prvku kniha:

Harry Potter J.K.Rowling 2005 29.99

Prvky stejné úrovně

Jedná se o uzly, které mají stejného rodiče. V následujícím příkladu jsou prvky „title“, „autor“, „year“ a „price“ všechny prvky stejné úrovně:

Harry Potter J.K.Rowling 2005 29.99

Předci

Rodič uzlu, rodič rodiče uzlu atd. V následujícím příkladu jsou předky prvku title prvky kniha a knihkupectví:

Harry Potter J.K.Rowling 2005 29.99

Potomci

Děti uzlu, děti potomků uzlu atd. V následujícím příkladu jsou potomky prvku „knihkupectví“ prvky „kniha“, „název“, „autor“, „rok“ a „cena“:

Harry Potter J.K.Rowling 2005 29.99

4 Syntax XPath

XPath používá výrazy cesty k výběru uzlů nebo sad uzlů v dokumentu XML. Uzel lze vybrat sledováním cesty nebo kroky. V níže uvedených příkladech použijeme následující dokument XML.

Harry Potter 29.99 Učení XML 39.95

Výběr uzlu

Pomocí výrazů XPath k výběru uzlů v dokumentu XML můžete vybrat uzel podle cesty nebo kroků. Nejužitečnější výrazy cesty jsou uvedeny níže:

Níže uvedená tabulka uvádí některé cesty výrazu a výsledek provedení výrazu:

výraz XPath Výsledek
knihkupectví Vybere všechny uzly s názvem "knihkupectví"
/knihkupectví Vybere kořenový prvek knihkupectví

Poznámka: Pokud cesta začíná lomítkem (/), je to vždy absolutní cesta k prvku!

knihkupectví/kniha Vybere všechny prvky „kniha“, které jsou potomky prvku „knihkupectví“.
//rezervovat Vybere všechny prvky "knihy" bez ohledu na to, kde se v dokumentu nacházejí
knihkupectví//kniha Vybere všechny prvky „kniha“, které jsou potomky prvku „knihkupectví“, bez ohledu na to, kde se nacházejí pod prvkem „knihkupectví“
//@lang Vybere všechny atributy s názvem „lang“

Predikáty

Predikáty se používají k nalezení konkrétního uzlu nebo uzlu, který obsahuje určitou hodnotu. Predikáty jsou vždy ohraničeny hranatými závorkami. Níže uvedená tabulka uvádí některé výrazy cesty s predikáty a výsledek výrazu:

Výrazy XPath Výsledek
/knihkupectví/kniha Vybere první prvek „kniha“, který je potomkem prvku „knihkupectví“.

Poznámka: V IE 5,6,7,8,9 má první uzel index , ale podle pokynů W3C je . Chcete-li tento problém vyřešit v IE, nastavte volbu "SelectionLanguage" pro XPath:

V JavaScriptu: xml.setProperty("SelectionLanguage", "XPath");
/knihkupectví/kniha Vybere poslední prvek „kniha“, který je potomkem prvku „knihkupectví“.
/knihkupectví/kniha Vybere předposlední prvek „kniha“, který je potomkem prvku „knihkupectví“.
/knihkupectví/kniha Výběr prvních dvou prvků „kniha“, které jsou potomky prvku „knihkupectví“.
//title[@lang] Vybere všechny prvky „title“, které mají atribut s názvem „lang“
//title[@lang="en"] Vybere všechny prvky „title“, které mají atribut „language“ s hodnotou „en“
/knihkupectví/kniha Vybere všechny prvky „kniha“ za prvkem „knihkupectví“, které mají prvek „cena“ s hodnotou větší než 35,00
/knihkupectví/kniha/titul Vybere všechny prvky „název“ knihy v prvku „knihkupectví“, které mají prvek „cena“ s hodnotou větší než 35,00

Výběr neznámých uzlů

Speciální znaky XPath lze použít k výběru neznámých uzlů XML.

V níže uvedené tabulce uvádíme některé cesty výrazů a výsledky výrazů:

Výběr více cest

Pomocí operátoru | ve výrazech XPath můžete vybrat více cest. Níže uvedená tabulka uvádí několik výrazů cesty a jejich výsledky:

5 Nápravy XPath

Dále v příkladu použijeme následující dokument XML.

Harry Potter 29.99 Učení XML 39.95

Osy definují sady uzlů vzhledem k aktuálnímu uzlu.

Název osy Výsledek
předek Vybere všechny předky (rodiče, prarodiče atd.) aktuálního uzlu
předek-nebo-já Vybere všechny předky (rodiče, prarodiče atd.) aktuálního uzlu a aktuální uzel samotný
atribut
dítě
potomek Vybere všechny děti (děti, vnoučata atd.) aktuálního uzlu
potomek-nebo-já Vybere všechny děti (děti, vnoučata atd.) aktuálního uzlu a aktuální uzel samotný
Následující Po zavření značky aktuálního uzlu vybere vše v dokumentu
následující-sourozenec Vybere všechny uzly stejné úrovně za aktuálním uzlem
jmenný prostor Vybere všechny uzly v daném jmenném prostoru aktuálního uzlu
rodič Vybere rodiče aktuálního uzlu
předchozí Vybere všechny uzly, které se objevují před aktuálním uzlem v dokumentu, s výjimkou předků, uzlů atributů a uzlů oboru názvů
předchozí-sourozenec Vybere všechny sourozence až po aktuální uzel
Vybere aktuální uzel

6 Výrazy vzorkovací cesty

Cesta umístění může být absolutní nebo relativní. Cesta absolutního umístění začíná lomítkem (/), ale relativní cesta nikoli. V obou případech se vzorkovací cesta skládá z jednoho nebo více kroků oddělených lomítky:

Absolutní cesta umístění:

/krok/krok/...

Cesta načtení relativní polohy:

Krok/krok/...

Každý krok je vyhodnocen vůči uzlům v aktuální sadě uzlů. Krok se skládá z:

  • osa (definuje stromový vztah mezi vybranými uzly a aktuálním uzlem);
  • kontrola uzlů (identifikuje uzel v ose);
  • nula nebo více predikátů (pro další upřesnění vybrané sady uzlů)

Syntaxe kroku načtení je:

Axisname::nodetestAxisname::nodetest[prediktor]

Příklad Výsledek
dítě::kniha Vybere všechny uzly knihy, které jsou potomky aktuálního uzlu
atribut::lang Vybírá atribut jazyka (lang) aktuálního uzlu
dítě::* Vybere všechny potomky aktuálního uzlu
atribut::* Vybere všechny atributy aktuálního uzlu
dítě::text() Vybere všechny textové uzly aktuálního uzlu
dítě::node() Vybere všechny bezprostřední potomky aktuálního uzlu
potomek::kniha Vybere všechny potomky aktuálního uzlu
předek::kniha Vybere všechny předky "knih" aktuálního uzlu
předek-nebo-já::kniha Vybere všechny knižní předky aktuálního uzlu - a aktuální uzel, pokud je to také kniha
dítě::*/dítě::cena Vybere všechny potomky "ceny" o úroveň dále od aktuálního uzlu

7 Operátoři XPath

Výrazy XPath se vracejí jako sada uzlů, řetězců, booleanů nebo číselných hodnot. Níže je uveden seznam operátorů používaných ve výrazech XPath:

Operátor Popis Příklad
| Vypočítá dvě sady uzlů //kniha | //CD
+ Přidání 6 + 4
- Odčítání 6 - 4
* Násobení 6 * 4
div Divize 8 díl 4
= Rovnost cena = 9,80
!= Nerovnost cena! = 9,80
< Méně než cena<9.80
<= Méně nebo stejně cena≤9,80
> Více než cena>9,80
>= Více nebo stejné cena≤9,80
nebo Nebo cena=9,80 nebo cena=9,70
a A cena>9,00 a cena<9.90
mod Zbytek divize 5 mod 2

8 Příklady XPath

Pojďme si projít základní syntaxi XPath s několika příklady. V níže uvedených příkladech použijeme následující dokument XML „books.xml“:

Každodenní italština Giada de Laurentiis 2005 30.00 Harry Potter J.K.Rowling 2005 29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Učení XML Erik T. Ray 2003 39.95

Načítání dokumentu XML

Ke stažení dokumentů XML použijte XMLHttpRequest, který je podporován většinou moderních prohlížečů:

Var xmlhttp=new XMLHttpRequest()

Kód pro starší prohlížeče Microsoft (IE 5 a 6):

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

Výběr uzlu

Bohužel XPath může v Internet Exploreru fungovat jinak než v jiných prohlížečích. V našich příkladech použijeme kód, který by měl fungovat ve většině prohlížečů. Internet Explorer používá metodu "selectNodes()" k výběru uzlů v dokumentu XML:

XmlDoc.selectNodes(xpath);

Firefox, Chrome, Opera a Safari používají metodu vyhodnocení() k výběru uzlů z dokumentu XML:

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

Vyberte všechny tituly

Následující příklad vybere všechny uzly záhlaví:

/knihkupectví/kniha/titul

Výběr názvu první knihy

Následující příklad vybere název prvního uzlu „kniha“ po prvku „knihkupectví“:

/knihkupectví/kniha/titul

Vyberte všechny ceny

Následující příklad vybere text všech cenových uzlů:

/knihkupectví/kniha/cena

Vybírá uzly s cenou >35

Následující příklad vybere všechny uzly s cenami nad 35:

/knihkupectví/kniha/cena

Výběr uzlů záhlaví s cenou >35

Následující příklad vybere všechny uzly titulu s cenou vyšší než 35:

/knihkupectví/kniha/titul

Xpath je dotazovací jazyk pro prvky dokumentu xml nebo xhtml. Stejně jako SQL je i xpath deklarativní dotazovací jazyk. Chcete-li získat data, která vás zajímají, stačí vytvořit dotaz, který tato data popisuje. Interpret jazyka xpath udělá všechnu špinavou práci za vás.
Velmi pohodlné, že? Podívejme se, jaké možnosti xpath nabízí pro přístup k uzlům webových stránek.

Vytvoření požadavku na uzly webové stránky

Upozorňuji na malou laboratorní práci, při které předvedu tvorbu xpath požadavků na webovou stránku. Budete moci opakovat žádosti, které jsem zadal, a hlavně se pokusit splnit své vlastní. Doufám, že díky tomu bude článek stejně zajímavý pro začátečníky i programátory znalé xpath to xml.

Pro laboratoř budeme potřebovat:
- xhtml webová stránka;
- prohlížeč Mozilla Firefox s doplňky;
- firebug;
- firePath;
(můžete použít jakýkoli jiný prohlížeč s podporou visual xpath)
- trochu času.

Jako webovou stránku pro provedení experimentu navrhuji hlavní stránku webu World Wide Web Consortium ("http://w3.org"). Je to tato organizace, která vyvíjí jazyky xquery(xpath), specifikaci xhtml a mnoho dalších internetových standardů.

Úkol
Získejte informace o konsorciálních konferencích z xhtml kódu hlavní stránky w3.org pomocí dotazů xpath.
Začněme psát xpath dotazy.
První požadavek Xpath
Otevřete záložku Firepath ve FireBug, pomocí selektoru vyberte prvek, který chcete analyzovat, klikněte na: Firepath vytvořila požadavek xpath pro vybraný prvek.

Pokud jste vybrali název první události, bude požadavek vypadat takto:

Po odstranění nepotřebných indexů bude dotaz odpovídat všem prvkům typu hlavičky.

Firepath zvýrazní prvky, které odpovídají dotazu. V reálném čase můžete vidět, které uzly dokumentu odpovídají dotazu.

Žádost o informace o místě konání konference:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Takto získáme seznam sponzorů:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

syntaxe xpath

Vraťme se k dotazům, které jsme vytvořili, a pochopíme, jak jsou strukturovány.
Podívejme se podrobně na první žádost

V tomto dotazu jsem rozdělil tři části, abych demonstroval schopnosti xpath. (Rozdělení na části je složité)

první díl
.// - rekurzivní sestup na nulu nebo více úrovní hierarchie z aktuálního kontextu. V našem případě je aktuálním kontextem kořen dokumentu

Druhá část
* - jakýkoli prvek,
[@id="w3c_home_upcoming_events"]– predikát, na jehož základě hledáme uzel, který má atribut id rovný „w3c_home_upcoming_events“. ID prvků XHTML musí být jedinečné. Dotaz „jakýkoli prvek se specifickým ID“ by proto měl vrátit jediný uzel, který hledáme.

Můžeme vyměnit * na přesný název uzlu div v této žádosti
div[@id="w3c_home_upcoming_events"]

Přejdeme tedy ve stromu dokumentů dolů k uzlu div[@id="w3c_home_upcoming_events"], který potřebujeme. Vůbec nás nezajímá, z jakých uzlů se strom DOM skládá a kolik úrovní hierarchie zůstává výše.

Třetí díl
/ul/li/div/p/a–xpath je cesta ke konkrétnímu prvku. Cesta se skládá z adresovacích kroků a podmínek kontroly uzlů (ul, li atd.). Kroky jsou odděleny znakem "/" (lomítko).

sbírky xpath
Není vždy možné přistupovat k uzlu zájmu pomocí predikátu nebo kroků adresování. Velmi často je na jedné úrovni hierarchie mnoho uzlů stejného typu a je nutné vybrat „pouze první“ nebo „pouze druhý“ uzel. Pro takové případy jsou poskytovány sbírky.

Kolekce xpath vám umožňují přistupovat k prvku pomocí jeho indexu. Indexy odpovídají pořadí, ve kterém byly prvky uvedeny v původním dokumentu. Pořadové číslo ve sbírkách se počítá od jedné.

Na základě skutečnosti, že „místo konání“ je vždy druhý odstavec za „názvem konference“, dostáváme následující dotaz:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Kde p je druhý prvek v množině pro každý uzel v seznamu /ul/li/div.

Podobně můžeme získat seznam sponzorů s požadavkem:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Některé funkce xpath
V xpath je mnoho funkcí pro práci s prvky v rámci kolekce. Dám jen pár z nich.

poslední():
Vrátí poslední prvek kolekce.
Dotaz ul/li/div/p - vrátí poslední odstavce pro každý uzel seznamu "ul".
Funkce first() není k dispozici. Pro přístup k prvnímu prvku použijte index "1".

text():
Vrátí testovací obsah prvku.
.//a – získáme všechny odkazy s textem „Archiv“.

position() a mod:
position() - vrací pozici prvku v množině.
mod je zbytek divize.

Kombinací těchto funkcí můžeme získat:
- ani prvky ul/li
- sudé prvky: ul/li

Srovnávací operace

  • < - логическое «меньше»
  • > - logické "větší než"
  • <= - логическое «меньше либо равно»
  • >= - logické „větší než nebo rovno“
ul/li , ul/li - seznam prvků od 3. čísla a naopak.

Na vlastní pěst

Zkus získat:
- i URL odkazy z levého menu „Standardy“;
- záhlaví všech zpráv, kromě první z hlavní 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čně

Na jednoduchém příkladu jsme viděli možnosti xpath pro přístup k uzlům webových stránek.
Xpath je průmyslový standard pro přístup k prvkům xml a xhtml, xslt transformacím.
Můžete jej použít k analýze libovolné html stránky. Pokud zdrojový html kód obsahuje významné chyby v označení, spusťte jej

Dnes se blíže podíváme na téma použití XPath s PHP. V příkladech uvidíte, jak XPath výrazně snižuje množství kódu. Podívejme se na používání dotazů a funkcí v XPath.

Na úvod vám poskytnu dva typy dokumentů: DTD a XML, pomocí kterých se podíváme na fungování PHP DOM XPath. Takto vypadají:

Kniha Autor Hrůza kapitola jedna Další kniha Další Autor Sci-fi kapitola jedna

Základní dotazy XPath

Jednoduchá syntaxe XPath umožňuje přístup k prvkům v dokumentu XML. Nejjednodušším způsobem můžete určit cestu k požadovanému prvku. Pomocí výše uvedeného dokumentu XML vrátí následující dotaz XPath kolekci aktuálních prvků nalezených v prvku knihy:

//knihovna/kniha

Takhle! Dvě lomítka definují kořenový prvek dokumentu a jedno lomítko přechází na podřízený prvek knihy. Je to jednoduché a rychlé, že?

Ale co když chcete vybrat konkrétní knižní prvek ze sady? Předpokládejme, že chcete knihy od „určitého autora“. Dotaz XPath pro toto by byl:

//knihovna/kniha/autor/..

Můžeš použít text() v hranatých závorkách pro porovnání hodnoty uzlu. Taky «/..» znamená, že chceme použít rodičovský prvek (tj. vrátit se o jeden uzel výše).

Dotazy XPath se provádějí pomocí jedné nebo dvou funkcí: dotaz() A vyhodnotit(). Oba tvoří požadavek, ale rozdíl je v vráceném výsledku. query() se vždy vrátí DOMNodeList, Na rozdíl od vyhodnotit() pokud je to možné, vrátí textový výsledek. Pokud by například váš dotaz XPath vrátil počet knih napsaných konkrétním autorem, pak by query() vrátilo prázdný DOMNodeList, value() by prostě vrátilo číslo, můžete to použít přímo k načtení dat z uzlu .

Výhody kódu XPath a rychlosti

Podívejme se na jednoduchý příklad, který vrátí počet knih napsaných konkrétním autorem. Na první metodu se podíváme tak, jak to děláme vždy, bez použití XPath. Nyní pochopíte, jak to udělat bez XPath a jak mnohem jednodušší je to udělat s XPath.

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

Další metoda vrací stejný výsledek, ale používá XPath k výběru těch knih, které jsou napsány konkrétním autorem.

domDocument); $vysledek = $xcesta->dotaz($dotaz); return $vysledek->délka; )

Všimněte si, že nemusíme znovu kontrolovat hodnotu každého prvku, abychom určili, který autor napsal jednotlivé knihy. Ale můžeme kód více zjednodušit pomocí funkce XPath počet() spočítat obsah prvků v této cestě.

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

Potřebné informace můžeme získat pomocí jednořádkového dotazu XPath. Není potřeba vytvářet mnoho PHP filtrů. Toto je nejjednodušší a nejrychlejší způsob, jak napsat tuto funkci!

Všimněte si, že v posledním příkladu bylo použito value(). Je to proto, že funkce count() vrací textový výsledek. Použití query() vrátí DOMNodeList, ale ten bude prázdný.

XPath se vyplatí používat, protože nejenže zjednodušuje váš PHP kód, ale nabízí také výhodu rychlosti. Všiml jsem si, že první verze byla v průměru o 30 % rychlejší ve srovnání s druhou. Ale třetí je o 10 % rychlejší než první. To samozřejmě závisí na vašem serveru a dotazech, které používáte. Použití XPath v jeho čisté formě poskytuje nejlepší výsledky v rychlosti a snadnosti psaní kódu.

Funkce XPath

Zde je několik funkcí, které lze použít s XPath. Najdete zde také spoustu zdrojů, které se podrobně zabývají každou dostupnou funkcí. Pokud potřebujete vypočítat DOMNodeList nebo porovnat nodeValue (hodnota uzlu), můžete najít vhodnou funkci XPath, která eliminuje použití zbytečného PHP kódu.

Už to znáte z příkladu funkce count(). Pomocí funkce id() získáme názvy knih s danými ISBN. Chcete-li to provést, musíte použít následující výraz XPath:

id("isbn1234 isbn1235")/název

Všimněte si, že hodnoty, které hledáte, by neměly být uzavřeny v závorkách, pouze odděleny mezerami. Také nepřemýšlejte o přidání čárky:

domDocument); $vysledek = $xcesta->dotaz($dotaz); $knihy = array(); foreach ($výsledek jako $uzel) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) return $books; )

Ovládání složitých funkcí v XPath je neuvěřitelně jednoduché.

Používání funkcí PHP s XPath

Někdy budete potřebovat více funkcí, které standardní funkce XPath nemohou poskytnout. Naštěstí PHP DOM umožňuje nativním PHP funkcím komunikovat s dotazy XPath.

Podívejme se na příklad, který vrátí počet slov v názvu knihy. V této nejjednodušší funkci napíšeme následující:

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

Ale můžeme také zahrnout funkci str_word_count() přímo do požadavku XPath. To lze provést v několika krocích. Nejprve musíme zaregistrovat jmenný prostor s objektem XPath. PHP funkce v požadavcích XPath se volají pomocí řetězce „php:functionString“, za kterým se zapíše název požadované funkce. Také jmenný prostor je podrobněji popsán na http://php.net/xpath. Jiné hodnoty jmenného prostoru vyvolá chybu. Poté musíme zavolat registerPHPFunctions(). Tato funkce říká PHP, že když je volání provedeno prostřednictvím jmenného prostoru "php:", PHP toto volání zpracuje.

Příklad syntaxe pro volání funkcí by byl:

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

Pojďme si to všechno dát dohromady v následujícím příkladu funkce getNumberOfWords():

domDocument); //registrace jmenného prostoru php $xpath->registerNamespace("php", "http://php.net/xpath"); //nyní lze volat funkce php v požadavcích xpath $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))"; return $xpath->evaluate($query); )

Všimněte si, že k získání textu uzlu nemusíte volat funkci XPath text(). Metoda registerPHPFunctions() to dělá automaticky. Následující ukázkový řádek kódu však bude také platný:

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

Registrace funkcí PHP není omezena na funkce, které jsou součástí PHP. Můžete definovat své vlastní funkce a používat je v XPath. Jediný rozdíl je v tom, že budete muset použít "php:function" místo "php:functionString".

Pojďme napsat funkci mimo třídu, abychom demonstrovali základní funkčnost. Funkce, kterou použijeme, vrátí knihy od autora "George Orwell". Mělo by vrátit true pro každý uzel, který chcete zahrnout do dotazu.

nodeValue == "George Orwell"; } !}

Argument, který je předán funkci, je pole prvků DOM. Tato funkce prochází polem a určuje potřebné prvky a poté je zahrne do DOMNodeList. V tomto příkladu byl testovaný uzel /book a k určení požadovaných prvků jsme také použili /author.

Nyní můžeme vytvořit funkci getGeorgeOrwellBooks():

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

Pokud je funkce Compare() statická, musíte upravit dotaz XPath:

//knihovna/kniha

Abych byl upřímný, všechny tyto funkce mohly být implementovány pomocí čistého kódu XPath. Ale příklad ukazuje, jak můžete rozšířit dotazy XPath a učinit je složitějšími.

Na závěr

XPath je skvělý způsob, jak snížit množství kódu a zvýšit jeho zpracování při práci s XML. Další funkce PHP DOM vám umožní rozšířit funkce XPath. To je opravdu užitečná věc, pokud ji využijete a ponoříte se do specifik, budete muset psát stále méně kódu.


XPath používá výrazy cesty k výběru uzlů v dokumentu XML nebo sadě uzlů. Uzlem po cestě (cesta) nebo etapě (kroky) k vybranému.

instance XML dokumentů

Tento dokument XML použijeme v níže uvedených příkladech.


Harry Potter
29.99


Učení XML
39.95

Vyberte uzel

XPath používá výrazy cesty k výběru uzlů v dokumentu XML. Nebo podél cesty přes uzel a vyberte krok. Níže jsou uvedeny nejužitečnější výrazy cesty:

V níže uvedené tabulce uvádíme některé cesty výrazu a výsledek výrazu:

výraz Cestavýsledek
knihkupectvíVyberte všechny podřízené uzly prvku knihy.
/ Knihkupectví

Vyberte knihkupectví kořenového prvku.

Poznámka: Pokud cesta začíná lomítkem (/), je cesta vždy reprezentativní pro absolutní cestu prvku!

knihkupectví/knihaVyberte podpoložky patřící do knihkupectví všechny položky knih.
// RezervovatVyberte všechny dílčí prvky knihy bez ohledu na jejich pozici v dokumentu.
knihkupectví // knihaVybere všechny prvky knihy, které nejsou potomky knihkupectví prvku, bez ohledu na jejich pozici v knihkupectví a pod ním.
// @LangVyberte všechny vlastnosti s názvem Lang.

Predikát(y)

Predikát se používá k nalezení konkrétního uzlu nebo uzlu, který obsahuje zadanou hodnotu.

Predikát je uzavřen v hranatých závorkách.

V níže uvedené tabulce jsme uvedli některé výrazy cesty s predikáty a výsledek výrazu:

výraz Cestavýsledek
/ Knihkupectví / knihaVyberte dílčí prvky, které patří k prvnímu prvku sešitu.
/Knihkupectví/kniha [poslední()]Vyberte dílčí prvky, které patří k prvku poslední knihy knihy.
/ Knihkupectví / kniha [poslední () - 1]Vyberte podpoložky související se vzájemným knihkupectvím druhé knižní položky.
/Knihkupectví/kniha [position()<3] Vyberte první dva prvky knihy prvku knihy patřící k dílčím prvkům.
// Název [@lang]Vybrat vše atribut s názvem Lang má název prvku.
// Název [@ LANG = "eng"]Vyberte všechny názvy prvků a tyto prvky mají hodnotu anglického atributu.
/knihkupectví/knihaVyberte všechny prvky knihy prvku kniha a hodnotu prvku ceny, která musí být větší než 35,00.
/knihkupectví/kniha/titulVyberte všechny prvky záhlaví prvku knihy prvku knihy, ve kterých musí být hodnota prvku ceny větší než 35,00.

Vyberte neznámé uzly

Zástupné znaky XPath lze použít k výběru neznámých prvků XML.

V níže uvedené tabulce jsou uvedeny některé výrazy cesty a také výsledky těchto výrazů:

Vyberte si více cest

Použití výrazu cesty "|" operátora, můžete zvolit několik cest.

V níže uvedené tabulce jsou uvedeny některé výrazy cesty a také výsledky těchto výrazů.