Xpath je dotazovací jazyk pre xml alebo xhtml prvky dokumentu. Podobne 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. Všetku „špinavú“ prácu za vás urobí tlmočník jazyka xpath.
Veľmi pohodlné, nie? Poďme sa pozrieť na to, čo ponúka xpath pre prístup k uzlom webovej stránky.
Podanie žiadosti hostiteľom webových stránok
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ť opakovať 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 by xml.Pre laboratórium potrebujeme:
- 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 pre experiment navrhujem hlavnú stránku webu 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 konferencii konzorcia z xhtml kódu domovskej stránky w3.org pomocou dotazov xpath.Začnime písať xpath dotazy.
Prvá požiadavka XPath
Otvorte záložku Firepath vo FireBug, pomocou selektora vyberte prvok, ktorý sa má analyzovať, kliknite: Firepath vytvoril dotaz 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čka“.
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 dopytom, ktoré sme vytvorili, a uvidíme, ako fungujú.Pozrime sa bližšie na prvú požiadavku.
V tomto dotaze som oddelil tri časti, aby som demonštroval schopnosti xpath. (Rozdelenie na časti je bežné)
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 hostiteľa div v tejto žiadosti
div[@id="w3c_home_upcoming_events"]
V strome dokumentov teda prejdeme na uzol, ktorý potrebujeme div[@id="w3c_home_upcoming_events"]. Je nám absolútne jedno, 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 – cesta ku konkrétnemu prvku. Cesta pozostáva z krokov adresovania a podmienok kontroly uzla (ul, li atď.). Kroky sú oddelené "/" (lomka).
zbierky
Nie je vždy možné pristupovať k záujmovému uzlu pomocou predikátu alebo krokov adresovania. Veľmi často je na rovnakej úrovni hierarchie niekoľko uzlov rovnakého typu 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 prezentované v zdrojovom dokumente. Poradové číslo v zbierkach sa počíta od jednej.
Na základe skutočnosti, že „miesto konania“ je vždy druhý odsek po „názve stretnutia“, 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 dotazom:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Niektoré funkcie xpath
xpath má veľa funkcií na prácu s prvkami v rámci kolekcie. Uvediem len niektoré z nich.posledný():
Vráti posledný prvok kolekcie.
Dotaz ul/li/div/p - vráti posledné odseky pre každý uzol v zozname "ul".
Funkcia first() nie je poskytnutá. Na prístup k prvému prvku použite index "1".
text():
Vráti obsah testu prvku.
.//a - získajte 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";
- titulky 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 silu xpath na 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í, prejdite ho
Syntax skratky XPath
Skratky syntaxe XPath môžu byť celkom užitočné. Nižšie sú uvedené pravidlá:
Self::node() možno skrátiť ako. ;
Parent::node() môže byť skrátené ako .. ;
Child::childname možno skrátiť ako childname ;
Atribút::childname môže byť skrátený ako @childname ;
/descendant-or-self::node()/ možno skrátiť ako // .
Napríklad cesta umiestnenia .//PLANET je skratka pre self::node()/descendant-or-self::node()/child::PLANET . Predikátový výraz môžete tiež skrátiť ako , like , atď. Práca s cestami umiestnenia XPath je oveľa jednoduchšia so skrátenou syntaxou. Nasledujúci zoznam uvádza niekoľko príkladov ciest umiestnenia pomocou skrátenej syntaxe:
PLANET vracia podradené prvky
* vráti všetky podradené prvky kontextového uzla;
Text() vráti všetky podradené textové uzly kontextového uzla;
@UNITS vráti atribút UNITS kontextového uzla;
@* vráti všetky atribúty kontextového uzla;
PLANET prináša tretie dieťa
PLANÉTA prináša späť posledné dieťa
*/PLANET vracia všetky vnúčatá
/PLANETS/PLANET/NAME vráti druhý prvok //PLANET vráti všetky deti PLANETS//PLANET vracia podradené prvky //PLANET/NAME vráti všetky prvky Vráti samotný kontextový uzol; .//PLANET vracia podradené prvky Vráti rodiča kontextového uzla; ../@UNITS vráti atribút UNITS rodiča kontextového uzla; .//.. vráti všetkých rodičov potomka kontextového uzla a rodiča kontextového uzla; PLANET prinavracia deti PLANET prinavracia deti PLANET[@UNITS="days"] vráti všetky deti PLANET[@UNITS="days"] vracia šieste dieťa PLANET[@COLOR and @UNITS] vráti všetky deti " //PLANET " vyberie všetky prvky * vyberie ľubovoľný prvok *[@UNITS] vyberie prvých päť potomkov kontextového uzla, ktoré majú atribút UNITS. Skrátená syntax Existujú dve pravidlá pre skratky osí pre vzory: child::childname môže byť skrátené ako childname; Atribút::childname môže byť skrátený ako @childname. Nasledujúci zoznam uvádza množstvo príkladov skrátených vzorov syntaxe; na konci kapitoly uvidíte Skrátená syntax predikátu Predikátové výrazy možno skrátiť vynechaním "position()=". Napríklad sa stáva, stáva sa atď. Použitie skrátenej syntaxe značne uľahčuje používanie výrazov XPath v predikátoch. Tu je riadok Čísla XPath XPath ukladá čísla vo formáte s pohyblivou rádovou čiarkou s dvojitou presnosťou. Podľa formálnej definície musia byť čísla XPath uložené v 64-bitovom formáte IEEE 754 s dvojitou presnosťou s pohyblivou rádovou čiarkou a všetky čísla sú uložené ako čísla s pohyblivou rádovou čiarkou. Aplikácia osí XPath Doteraz sme pokryli tri časti krokov umiestnenia – os, podmienku uzla a predikát. Tieto prvky by ste mali poznať z našej práce so vzormi výberu, ale všimnite si os v predchádzajúcom príklade, predchádzajúca-súrodenec. Stále Testovanie výrazov XPath Balík Xalan obsahuje praktický vzorový program ApplyXPath.java, ktorý vám umožňuje použiť výraz XPath na dokument a pozrieť sa na výsledok, čo je veľmi užitočné pri testovaní. Ak chcete spustiť tento príklad, budete musieť skompilovať ApplyXPath.java do ApplyXPath.class Xpath- deklaratívny dopytovací jazyk k prvkom xml alebo (x)html dokument a xslt transformácií. Užitočné zdroje: Úplná špecifikácia pre Xpath 1.0 v ruštine tu - http://citforum.ru/internet/xpath/xpath.shtml. Online tester Xpath – http://www.xpathtester.com/xpath/ Na vyhľadávanie prvkov DOM pomocou Xpath má Firebug zabudovanú funkciu: $x(xpath [, contextNode [, resultType]]) Typ výsledku: XPathResult.NUMBER_TYPE XPathResult.STRING_TYPE XPathResult.BOOLEAN_TYPE XPathResult.FIRST_ORDERED_NODE_TYPE XPathResult.UNORDERED_NODE_ITERATOR_TYPE Príklad použitia dotazov XPATH vo Firebug: $x("//tr[@data-place]/@data-place").value $x("string(//tr[@data-place]/@data-place)") p/predok::* # všetci rodičia (http://bit.ly/1ta7mh9) p/nasledujúci-súrodenci::* # všetci nasledujúci súrodenci p/predchádzajúci-súrodenci::* # všetci predchádzajúci súrodenci p/nasledujúci::* # všetky nasledujúce prvky okrem potomkov (http://bit.ly/1ta83H5) p/preceding::* # všetky predchádzajúce prvky okrem predkov p/potomok-alebo-ja::* # kontextový uzol a všetci jeho potomkovia p/predok- or-self::* # kontextový uzol a všetci jeho predkovia Označuje filtračné prvky Vstup[@type=text] # atribúty majú predponu @ input[@class="OK"] # p # odsekov bez atribútov *[@style] # všetky prvky s atribútom style a[. = "OK"] # odkazy s hodnotou "OK" a/@id # ID odkazov a/@* # všetky atribúty odkazov a[@id a @rel] # odkazy, ktoré obsahujú atribúty id a rel a[@id][ @rel] # to isté a # odkazy obsahujú prvok alebo
Základné funkcie Xpath – http://www.w3.org/TR/xpath/#corelib Name() # return name element string(val) string(a/@id) # get value value substring(val, from, to) substring(@id, 1, 6) # cut part of the string substring-after(val, from ) substring-after(@id, "FROM") substring-before string-length() # vráti počet znakov v reťazci count() # vráti počet prvkov concat() normalize-space() # podobne ako trim, odstraňuje medzery Príklad: begin -with() obsahuje() translate("bar","abc","ABC") # BAr XPath používa výrazy cesty na výber uzlov a sád uzlov v dokumente XML. Uzol sa vyberie sledovaním vopred určenej cesty alebo takzvaných krokov. Na demonštráciu syntaxe XPath sa použije nasledujúci dokument XML:
Na výber uzlov v dokumente XML používa XPath výrazy cesty. Uzol sa vyberie podľa danej cesty. Najužitočnejšie výrazy cesty: Nasledujúca tabuľka uvádza niektoré výrazy XPath, ktoré vám umožňujú vykonať niektoré výbery vo vzorovom dokumente XML: Predikáty vám umožňujú nájsť konkrétny uzol alebo uzol s konkrétnou hodnotou. Predikáty sú vždy uzavreté v hranatých zátvorkách. Nasledujúca tabuľka uvádza niektoré výrazy XPath s predikátmi, ktoré umožňujú výber podľa vzorového dokumentu XML: Na nájdenie predtým neznámych uzlov v dokumente XML umožňuje XPath použitie špeciálnych znakov. Nasledujúca tabuľka uvádza niektoré výrazy XPath so špeciálnymi znakmi, ktoré umožňujú výber podľa vzorového dokumentu XML: Pomocou operátora | vo výraze XPath vám umožňuje vybrať viacero ciest. Nasledujúca tabuľka uvádza niektoré výrazy XPath, ktoré vám umožňujú vykonávať výbery vo vzorovom dokumente XML.Použitie Xpath vo Firebug
Príklady
//div //a //*/predok-alebo-seba::tlačidlo Základná syntax
Spôsoby
. # aktuálny kontext.// # rekurzívne zostupovať (nula alebo viac úrovní z aktuálneho kontextu) /html/body # tabuľka absolútnej cesty//a # relatívna cesta a # cesta vzhľadom k aktuálnemu kontextu //* # všetko v aktuálnom kontexte li/* /a # odkazy, ktoré sú "vnúčatami" li //a|//tlačidlo # odkazy a tlačidlá (kombinujúce dve sady uzlov) Vzťahy
a/i/parent::p # bezprostredný rodič, Získavanie uzlov
/div/text() # získať textové uzly /div/text() # získať prvý textový uzol Poloha prvku
a # prvý prvok a # posledný prvok a[i] # druhý odkaz, ktorý obsahuje prvok a # Prvé 3 odkazy ul # a zoznam (UL), ktorého prvý prvok obsahuje hodnotu "OK" tr # nie párne prvky tr # párne prvky p/text() # druhý textový uzol Atribúty a filtre
Funkcie
Matematika
//p[ position() = floor(last() div 2 + 0.5) or position() = strop(last() div 2 + 0.5) ] //tr position() # div # division mod # zvyšok rozdelenia stropu () # minimálna celočíselná spodná hranica() # maximálne celé číslo zaokrúhlená() súčet() Zoskupovanie
(table/tbody/tr) # posledný riadok zo všetkých tabuliek (//h1|//h2) # nadpis prvej alebo druhej úrovne, ktorý obsahuje "Text" Podmienky zloženého filtra
Vzorový dokument XML
Výber uzla
výraz XPath
Výsledok
správy
Vyberie všetky uzly s názvom "správy"
/správy
Vyberie koreňový prvok správ
Poznámka: Ak cesta začína lomkou (/), potom vždy predstavuje absolútnu cestu k prvku!správy/poznámka
Vyberie všetky prvky poznámky, ktoré sú potomkami prvku správy
// Poznámka
Vyberie všetky prvky poznámky bez ohľadu na to, kde sa v dokumente nachádzajú
správy//poznámka
Vyberie všetky prvky poznámky, ktoré sú potomkami prvku messages, bez ohľadu na to, kde sa nachádzajú v prvku messages
//@dátum
Vyberie všetky atribúty s názvom dátum
Predikáty
výraz XPath
Výsledok
/správy/poznámka
Vyberie prvý prvok poznámky, ktorý je priamym potomkom prvku správy.
Poznámka: V IE 5,6,7,8,9 by prvý uzol bol , ale podľa W3C by mal byť . Ak chcete vyriešiť tento problém v IE, musíte nastaviť voľbu SelectionLanguage na XPath.
V JavaScripte: xml.setProperty("SelectionLanguage","XPath");/správy/poznámka
Vyberie posledný prvok poznámky, ktorý je priamym potomkom prvku správy.
/správy/poznámka
Vyberie predposledný prvok poznámky, ktorý je priamym potomkom prvku správy.
/správy/poznámka
Vyberie všetky prvky nadpisu, ktoré majú atribút dátumu
//nadpis[@date="10/01/2008"]
Vyberie všetky prvky nadpisu, ktoré majú atribút dátumu s hodnotou "10/01/2008"
Výber predtým neznámych uzlov
Výber viacerých ciest
Zlaté čísla Ako predať krásne telefónne číslo
Ťažba kryptomeny: čo to je jednoduchými slovami
Najlepší operačný systém pre laptop: Kompletná recenzia
Programy na sťahovanie hudby od spolužiakov Stiahnite si smutnú pesničku od spolužiakov zo sociálnej siete
Mobilná verzia prehliadača Yandex