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:
Příklady uzlů v dokumentu XML výše:
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:
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:
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ě:
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í:
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“:
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.
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.
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 |
já | 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“:
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“
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í:
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.
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 Cesta | vý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í/kniha | Vyberte podpoložky patřící do knihkupectví všechny položky knih. |
// Rezervovat | Vyberte všechny dílčí prvky knihy bez ohledu na jejich pozici v dokumentu. |
knihkupectví // kniha | Vybere všechny prvky knihy, které nejsou potomky knihkupectví prvku, bez ohledu na jejich pozici v knihkupectví a pod ním. |
// @Lang | Vyberte 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 Cesta | výsledek |
---|---|
/ Knihkupectví / kniha | Vyberte 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í/kniha | Vyberte všechny prvky knihy prvku kniha a hodnotu prvku ceny, která musí být větší než 35,00. |
/knihkupectví/kniha/titul | Vyberte 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ů.