Rövidített XPath szintaxis. Példák xpath lekérdezésekre a html-hez A következő tengely használatával
Az XPath az XML-dokumentumok elemei és attribútumai közötti navigálásra szolgál. Az XPath a W3C XSLT szabvány egyik alapvető eleme.
1 Mi történt XPath
XPath kifejezések
Az XPath elérési út-kifejezéseket használ az egyes csomópontok vagy csomópontok halmazának kiválasztására egy XML-dokumentumban. Ezek a kifejezések nagyon hasonlítanak azokhoz a kifejezésekhez, amelyeket egy hagyományos számítógépes fájlrendszerrel való munka során láthat.
Standard XPath függvények
Az XPath több mint 100 beépített funkciót tartalmaz. Vannak függvények karakterlánc- és numerikus értékekhez, dátumhoz és időhöz, csomópont-összehasonlításhoz és QName-manipulációhoz, szekvenciakezeléshez, logikai értékekhez és még sok máshoz.
Az XPath az XSLT-ben használatos
Az XPath az XSLT szabvány egyik alapvető eleme. Az XPath ismerete nélkül nem tud XSLT dokumentumokat létrehozni.
2 Terminológia XPath
Csomópontok
Az XPathban hétféle csomópont létezik: elem, attribútum, szöveg, névtér, feldolgozási utasítások, megjegyzések és dokumentumcsomópontok. Az XML dokumentumok feldolgozása csomópontok faként történik. A fa legfelső elemét gyökérelemnek nevezzük. Tekintse meg a következő XML dokumentumot:
Példa csomópontokra a fenti XML-dokumentumban:
Atomértékek
Az atomi értékek olyan csomópontok, amelyeknek nincs gyermeke vagy szülei. Példa atomi értékekre:
J. K. Rowling "hu"
Elemek
Az elemek atomi értékek vagy csomópontok.
3 Kapcsolat csomópontok
Szülő
Minden elemnek és attribútumnak van egy szülője. A következő példában a könyv elem a cím, a szerző, az évszám és az ár elemek szülője:
leszármazottak
Az elem csomópontjainak lehet nulla, egy vagy több gyermeke. A következő példában a "cím", "szerző", "év" és "ár" elemek mind a könyv elem gyermekei:
Azonos szintű elemek
Ezek olyan csomópontok, amelyeknek ugyanaz a szülője. A következő példában a "cím", "szerző", "év" és "ár" elemek mind azonos szintű elemek:
Ősök
A csomópont szülője, a csomópont szülőjének szülője stb. A következő példában a cím elem ősei a könyv és a könyvesbolt elemek:
leszármazottak
Egy csomópont gyermekei, egy csomópont gyermekei stb. A következő példában a "könyvesbolt" elem gyermekei a "book", "title", "author", "year" és "price" elemek:
4 Szintaxis XPath
Az XPath elérési út-kifejezéseket használ a csomópontok vagy csomópontkészletek kiválasztására egy XML-dokumentumban. Egy csomópont egy útvonal követésével vagy lépésekkel választható ki. Az alábbi példákban a következő XML-dokumentumot fogjuk használni.
Csomópont kiválasztása
Ha XPath-kifejezésekkel jelöli ki a csomópontokat egy XML-dokumentumban, akkor egy útvonal vagy lépések követésével jelölhet ki egy csomópontot. Az alábbiakban felsoroljuk a leghasznosabb elérési út kifejezéseket:
Az alábbi táblázat felsorol néhány kifejezési útvonalat és a kifejezés végrehajtásának eredményét:
XPath kifejezés | Eredmény |
---|---|
könyvesbolt | Kijelöli az összes "könyvesbolt" nevű csomópontot |
/könyvesbolt | Kijelöli a könyvesbolt gyökérelemét Jegyzet: Ha egy útvonal perjellel (/) kezdődik, az mindig az elem abszolút elérési útja! |
könyvesbolt/könyv | Kijelöli az összes „book” elemet, amely a „könyvesbolt” elem leszármazottja |
//könyv | Kijelöli az összes "könyv" elemet, függetlenül attól, hogy hol vannak a dokumentumban |
könyvesbolt//könyv | Kijelöli az összes "book" elemet, amely a "bookstore" elem gyermeke, függetlenül attól, hogy hol vannak a "bookstore" elem alatt |
//@lang | Kijelöli az összes "lang" nevű attribútumot |
Predikátumok
A predikátumok egy adott csomópont vagy egy adott értéket tartalmazó csomópont megkeresésére szolgálnak. A predikátumokat mindig szögletes zárójelek veszik körül. Az alábbi táblázat felsorol néhány predikátummal rendelkező útvonalkifejezést és a kifejezés eredményét:
XPath kifejezések | Eredmény |
---|---|
/könyvesbolt/könyv | Kijelöli az első "book" elemet, amely a "bookstore" elem gyermeke. Jegyzet: Az IE 5,6,7,8,9 verziójában az első csomópont indexe , de a W3C irányelvei szerint ez. A probléma megoldásához az IE-ben állítsa be a „SelectionLanguage” beállítást az XPath-ban: JavaScriptben: xml.setProperty("SelectionLanguage", "XPath"); |
/könyvesbolt/könyv | Kijelöli az utolsó „book” elemet, amely a „bookstore” elem gyermeke |
/könyvesbolt/könyv | Kijelöli az utolsó előtti "book" elemet, amely a "könyvesbolt" elem gyermeke |
/könyvesbolt/könyv | Az első két „könyv” elem kiválasztása, amelyek a „könyvesbolt” elem gyermekei |
//cím[@lang] | Kijelöli az összes "title" elemet, amelynek "lang" attribútuma van |
//title[@lang="en"] | Kijelöli az összes "title" elemet, amely "en" értékű "language" attribútummal rendelkezik |
/könyvesbolt/könyv | Kijelöli az összes "book" elemet a "bookstore" elem után, amelyekben van egy "price" elem, amelynek értéke nagyobb, mint 35,00 |
/könyvesbolt/könyv/cím | Kijelöli a "bookstore" elem összes könyv "címe" elemét, amely 35,00-nál nagyobb értékű "price" elemet tartalmaz |
Ismeretlen csomópontok kiválasztása
XPath speciális karakterek használhatók ismeretlen XML-csomópontok kiválasztására.
Az alábbi táblázatban felsoroltunk néhány kifejezési útvonalat és kifejezési eredményt:
Több útvonal kiválasztása
Az operátor használata | XPath kifejezésekben több útvonalat is kiválaszthat. Az alábbi táblázat több útvonalkifejezést és azok eredményeit sorol fel:
5 Tengelyek XPath
A példában később a következő XML-dokumentumot fogjuk használni.
A tengelyek csomópontkészleteket határoznak meg az aktuális csomóponthoz képest.
Tengely neve | Eredmény |
---|---|
ős | Kijelöli az aktuális csomópont összes ősét (szülők, nagyszülők stb.). |
ős-vagy-én | Kijelöli az aktuális csomópont összes ősét (szülők, nagyszülők stb.) és magát az aktuális csomópontot |
tulajdonság | |
gyermek | |
leszármazott | Kijelöli az aktuális csomópont összes gyermekét (gyerekek, unokák stb.). |
leszármazott-vagy-én | Kijelöli az aktuális csomópont összes gyermekét (gyerekek, unokák stb.) és magát az aktuális csomópontot |
következő | Mindent kijelöl a dokumentumban az aktuális csomópont címkéjének bezárása után |
követő-testvér | Kijelöli az összes azonos szintű csomópontot az aktuális csomópont után |
névtér | Kijelöli az összes csomópontot az aktuális csomópont megadott névterében |
szülő | Kiválasztja az aktuális csomópont szülőjét |
megelőző | Kijelöli az összes csomópontot, amely az aktuális csomópont előtt jelenik meg a dokumentumban, kivéve az ősöket, az attribútumcsomópontokat és a névtér csomópontokat |
megelőző-testvér | Kijelöli az összes testvért az aktuális csomópontig |
maga | Kijelöli az aktuális csomópontot |
6 Kifejezések mintavételi utak
A hely elérési útja lehet abszolút vagy relatív. Az abszolút hely elérési útja perjellel (/) kezdődik, de a relatív útvonal nem. A mintavételi útvonal mindkét esetben egy vagy több lépésből áll, amelyeket perjelek választanak el:
A hely abszolút elérési útja:
/lépés/lépés/...
Relatív hely lekérési útvonala:
Lépés/lépés/...
Minden lépés kiértékelésre kerül az aktuális csomópontkészletben lévő csomópontokhoz képest. A lépés a következőkből áll:
- tengely (meghatározza a fakapcsolatot a kiválasztott csomópontok és az aktuális csomópont között);
- csomópont ellenőrzése (a tengelyen belüli csomópontot azonosítja);
- nulla vagy több predikátum (a kiválasztott csomópontkészlet további finomításához)
A lekérési lépés szintaxisa a következő:
Tengelynév::csomópontteszt Tengelynév::csomópontteszt[jósló]
Példa | Eredmény |
---|---|
gyerek::könyv | Kijelöli az összes olyan könyvcsomópontot, amely az aktuális csomópont gyermeke |
attribútum::lang | Kiválasztja az aktuális csomópont nyelvi attribútuma (lang). |
gyermek::* | Kijelöli az aktuális csomópont összes gyermekét |
tulajdonság::* | Kijelöli az aktuális csomópont összes attribútumát |
gyerek::szöveg() | Kijelöli az aktuális csomópont összes szöveges csomópontját |
gyermek::node() | Kijelöli az aktuális csomópont összes közvetlen gyermekét |
leszármazottja::könyv | Kijelöli az aktuális csomópont összes gyermekét |
ős::könyv | Kijelöli az aktuális csomópont "könyveinek" összes ősét |
ős-vagy-én::könyv | Kijelöli az aktuális csomópont összes könyvelődjét – és az aktuális csomópontot, ha az is egy könyv |
gyerek::*/gyerek::ár | Kijelöli az "ár" összes gyermekét egy szinttel távolabb az aktuális csomóponttól |
7 Üzemeltetők XPath
Az XPath kifejezések csomópontok, karakterláncok, logikai értékek vagy numerikus értékek halmazaként térnek vissza. Az alábbiakban felsoroljuk az XPath kifejezésekben használt operátorokat:
Operátor | Leírás | Példa |
---|---|---|
| | Két csomópont-készletet számít ki | //könyv | //CD |
+ | Kiegészítés | 6 + 4 |
- | Kivonás | 6 - 4 |
* | Szorzás | 6 * 4 |
div | Osztály | 8 div 4 |
= | Egyenlőség | ár = 9,80 |
!= | Egyenlőtlenség | ár!=9.80 |
< | Kevesebb, mint | ár<9.80 |
<= | Kisebb vagy egyenlő | ár≤9,80 |
> | Több mint | ár>9,80 |
>= | Több vagy egyenlő | ár≤9,80 |
vagy | Vagy | ár=9,80 vagy ár=9,70 |
és | ÉS | ár>9,00 és ár<9.90 |
mod | A hadosztály maradéka | 5 mod 2 |
8 Példák XPath
Nézzük meg az XPath alapszintaxisát néhány példával. Az alábbi példákban a következő „books.xml” XML-dokumentumot fogjuk használni:
XML dokumentum betöltése
Az XMLHttpRequest használatával töltheti le az XML dokumentumokat, amelyet a legtöbb modern böngésző támogat:
Var xmlhttp=new XMLHttpRequest()
Kód a régi Microsoft böngészőkhöz (IE 5 és 6):
Var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
Csomópont kiválasztása
Sajnos előfordulhat, hogy az XPath másképp működik az Internet Explorerben, mint más böngészőkben. Példáinkban olyan kódot fogunk használni, amelynek a legtöbb böngészőben működnie kell. Az Internet Explorer a "selectNodes()" metódust használja a csomópontok kiválasztásához egy XML-dokumentumban:
XmlDoc.selectNodes(xpath);
A Firefox, a Chrome, az Opera és a Safari az assessment() metódus segítségével jelöli ki a csomópontokat egy XML-dokumentumból:
XmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);
Válassza ki az összes címet
A következő példa az összes fejléccsomópontot kiválasztja:
/könyvesbolt/könyv/cím
Az első könyv címének kiválasztása
A következő példa a "bookstore" elem utáni első "book" csomópont címét választja ki:
/könyvesbolt/könyv/cím
Válassza ki az összes árat
A következő példa az összes árcsomópont szövegét választja ki:
/könyvesbolt/könyv/ár
Olyan csomópontokat választ ki, amelyek ára >35
A következő példa az összes csomópontot kiválasztja, amelynek ára 35 felett van:
/könyvesbolt/könyv/ár
35 feletti árú fejléccsomópontok kiválasztása
A következő példa az összes 35-nél nagyobb árú címcsomópontot kiválasztja:
/könyvesbolt/könyv/cím
Az Xpath egy lekérdezési nyelv az xml vagy xhtml dokumentumelemekhez. Az SQL-hez hasonlóan az xpath egy deklaratív lekérdezési nyelv. Az érdeklődésre számot tartó adatok megszerzéséhez csak egy lekérdezést kell létrehoznia, amely leírja ezeket az adatokat. Az xpath nyelvi tolmács elvégzi helyetted az összes piszkos munkát.
Nagyon kényelmes, nem? Nézzük meg, milyen lehetőségeket kínál az xpath a weboldal csomópontjainak eléréséhez.
Kérelem létrehozása a weboldal csomópontjaihoz
Egy kisebb labormunkát ajánlok figyelmükbe, melynek során bemutatom az xpath kérések weblapra történő létrehozását. Megismételheti a kéréseimet, és ami a legfontosabb, megpróbálhatja teljesíteni a sajátját. Remélem, hogy ennek köszönhetően a cikk egyformán érdekes lesz a kezdőknek és a programozóknak, akik ismerik az xpath to xml-t.A laboratóriumhoz szükségünk lesz:
- xhtml weboldal;
- Mozilla Firefox böngésző kiegészítőkkel;
- firebug;
- FirePath ;
(bármilyen más böngészőt használhat Visual xpath támogatással)
- egy kis idő.
Kísérlet lebonyolítására szolgáló weboldalként a World Wide Web Consortium webhely főoldalát ("http://w3.org") javaslom. Ez a szervezet fejleszti az xquery(xpath) nyelveket, az xhtml specifikációt és sok más internetes szabványt.
Feladat
A konzorciumi konferenciákkal kapcsolatos információk lekérése a w3.org főoldal xhtml kódjából xpath lekérdezések segítségével.Kezdjük el írni az xpath lekérdezéseket.
Az első Xpath kérés
Nyissa meg a Firepath lapot a FireBugban, válassza ki a szelektorral az elemezni kívánt elemet, kattintson: A Firepath xpath kérést hozott létre a kiválasztott elemhez.Ha az első esemény címét választotta, akkor a kérés a következő lesz:
A szükségtelen indexek eltávolítása után a lekérdezés a fejléctípus összes elemének megfelel.
A Firepath kiemeli a lekérdezésnek megfelelő elemeket. Valós időben láthatja, hogy mely dokumentumcsomópontok felelnek meg a lekérdezésnek.
Információkérés a konferencia helyszíneiről:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Így kapjuk meg a szponzorok listáját:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
xpath szintaxis
Térjünk vissza az általunk létrehozott lekérdezésekhez, és ismerjük meg azok felépítését.Tekintsük részletesen az első kérést
Ebben a lekérdezésben három részre osztottam, hogy bemutassam az xpath képességeit. (A részekre bontás trükkös)
Első rész
.//
- rekurzív süllyedés a hierarchia nulla vagy több szintjére az aktuális kontextusból. Esetünkben a jelenlegi kontextus a dokumentumgyökér
Második rész
*
- bármely elem,
[@id="w3c_home_upcoming_events"]– egy predikátum, amely alapján olyan csomópontot keresünk, amelynek id attribútuma „w3c_home_upcoming_events” értékű. Az XHTML elemazonosítóknak egyedinek kell lenniük. Ezért a „bármely meghatározott azonosítóval rendelkező elem” lekérdezésnek az egyetlen keresett csomópontot kell visszaadnia.
Cserélhetjük *
a csomópont pontos nevére div ebben a kérésben
div[@id="w3c_home_upcoming_events"]
Így lefelé megyünk a dokumentumfán a szükséges div[@id="w3c_home_upcoming_events"] csomóponthoz. Egyáltalán nem érdekel bennünket, hogy a DOM-fa milyen csomópontokból áll, és a hierarchia hány szintje marad fent.
A harmadik rész
/ul/li/div/p/a–xpath egy adott elem elérési útja. Az útvonal címzési lépésekből és csomópont-ellenőrzési feltételekből (ul, li stb.) áll. A lépéseket "/" (perjel) választja el.
xpath gyűjtemények
Nem mindig lehet elérni a kívánt csomópontot predikátum vagy címzési lépések használatával. Nagyon gyakran sok azonos típusú csomópont van egy hierarchia szinten, és ki kell választani a „csak az első” vagy a „csak a második” csomópontot. Az ilyen esetekre gyűjtéseket biztosítanak.Az xpath gyűjtemények lehetővé teszik az elemek elérését az indexe alapján. Az indexek annak a sorrendnek felelnek meg, ahogyan az elemek az eredeti dokumentumban megjelentek. A gyűjtemények sorozatszámát egytől számítják.
Abból a tényből kiindulva, hogy a „helyszín” mindig a „konferencia neve” utáni második bekezdés, a következő lekérdezést kapjuk:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Ahol p a halmaz második eleme az /ul/li/div lista minden csomópontjához.
Hasonlóképpen a szponzorok listáját is megkaphatjuk a kéréssel:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Néhány xpath függvény
Az xpath-ban számos funkció található a gyűjtemény elemeivel való munkavégzéshez. Csak néhányat adok belőlük.utolsó():
A gyűjtemény utolsó elemét adja vissza.
Az ul/li/div/p lekérdezés – minden „ul” listacsomópont utolsó bekezdéseit adja vissza.
A first() függvény nincs megadva. Az első elem eléréséhez használja az "1" indexet.
szöveg():
Egy elem teszttartalmát adja vissza.
.//a – az összes „Archívum” szövegű hivatkozást megkapjuk.
position() és mod:
position() - egy halmazban lévő elem pozícióját adja vissza.
mod a felosztás maradéka.
Ezeket a funkciókat kombinálva a következőket kaphatjuk:
- még az ul/li elemeket sem
- páros elemek: ul/li
Összehasonlító műveletek
- < - логическое «меньше»
- > - logikai „nagyobb, mint”
- <= - логическое «меньше либо равно»
- >= - logikai „nagyobb vagy egyenlő”
Egyedül
Megpróbálni megszerezni:- akár URL hivatkozások a bal oldali „Szabványok” menüből;
- minden hír fejléce, kivéve az elsőt a w3c.org főoldaláról.
Xpath PHP5-ben
$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; )Végül
Egy egyszerű példával láttuk az xpath képességeit a weboldal csomópontjainak elérésére.Az Xpath az xml elemek és az xhtml, xslt átalakítások elérésének iparági szabványa.
Használhatja bármely html oldal elemzésére. Ha a forrás html kód jelentős hibákat tartalmaz a jelölésben, futtassa végig
Ma közelebbről megvizsgáljuk az XPath PHP-vel való használatának témáját. A példákban látni fogja, hogy az XPath hogyan csökkenti jelentősen a kód mennyiségét. Nézzük meg a lekérdezések és függvények használatát XPathban.
Az elején kétféle dokumentumot fogok a rendelkezésére bocsátani: DTD és XML, amelyek segítségével megvizsgáljuk a PHP DOM XPath működését. Így néznek ki:
Alapvető XPath lekérdezések
Az egyszerű XPath szintaxis lehetővé teszi az XML-dokumentum elemeinek elérését. A legegyszerűbb módon megadhatja a kívánt elem elérési útját. A fent megadott XML-dokumentum használatával a következő XPath-lekérdezés a book elemben található aktuális elemek gyűjteményét adja vissza:
//könyvtár/könyv
Mint ez! Két perjel határozza meg a dokumentum gyökérelemét, és egy perjel a könyv gyermekelemére lép át. Egyszerű és gyors, nem?
De mi van akkor, ha egy adott könyvelemet szeretne kiválasztani egy készletből? Tegyük fel, hogy egy „bizonyos szerző” könyveit szeretné. Az XPath lekérdezés ehhez a következő lenne:
//könyvtár/könyv/szerző/..
Te tudod használni szöveg() szögletes zárójelben a csomópont értékének összehasonlításához. Is «/..» azt jelenti, hogy a szülőelemet szeretnénk használni (azaz egy csomóponttal feljebb megyünk vissza).
Az XPath lekérdezések egy vagy két függvény használatával készülnek: lekérdezés()És értékel(). Mindkettő kérést képez, de a különbség a visszaadott eredményben van. query() mindig visszatér DOMNodeList, Nem úgy mint értékel() szöveges eredményt ad vissza, ha lehetséges. Például, ha az XPath-lekérdezés egy adott szerző által írt könyvek számát adja vissza, akkor a query() egy üres DOMNodeList-t, az value() egyszerűen egy számot adna vissza, akkor ezt közvetlenül használhatja az adatok lekérésére a csomópontból. .
XPath kód és sebesség előnyei
Nézzünk egy egyszerű példát, amely visszaadja egy adott szerző által írt könyvek számát. Az első módszert úgy fogjuk megvizsgálni, ahogyan szoktuk, XPath használata nélkül. Most meg fogja érteni, hogyan kell ezt megtenni XPath nélkül, és mennyivel egyszerűbb XPath használatával.
domDocument->getElementsByTagName("szerző"); foreach ($elemek mint $elem) ( if ($elem->nodeValue == $szerző) ( $összesen++; ) ) return $szám; )
A következő módszer ugyanazt az eredményt adja vissza, de az XPath segítségével kiválasztja azokat a könyveket, amelyeket egy adott szerző írt.
domDocument); $eredmény = $xpath->query($query); return $eredmény->hossz; )
Vegye figyelembe, hogy nem kell újra ellenőriznünk az egyes elemek értékét annak meghatározásához, hogy melyik szerző írta az egyes könyveket. De az XPath függvény használatával jobban leegyszerűsíthetjük a kódot számol() hogy megszámolja ezen az útvonalon az elemek tartalmát.
domDocument); return $xpath->evaluate($query); )
Egysoros XPath lekérdezéssel megkaphatjuk a szükséges információkat. Nincs szükség sok PHP szűrő létrehozására. Ez a legegyszerűbb és leggyorsabb módja ennek a funkciónak a megírásának!
Vegye figyelembe, hogy az értékelés()-et az utolsó példában használták. Ennek az az oka, hogy a count() függvény szöveges eredményt ad vissza. A query() használata egy DOMNodeList-et ad vissza, de az üres lesz.
Az XPath-ot érdemes használni, mert nem csak egyszerűbbé teszi a PHP-kódot, hanem gyorsasági előnyöket is kínál. Észrevettem, hogy az első verzió átlagosan 30%-kal gyorsabb volt a másodikhoz képest. De a harmadik 10%-kal gyorsabb, mint az első. Természetesen ez a szervertől és a használt lekérdezésektől függ. Az XPath tiszta formájában a legnagyobb eredményeket a gyors és egyszerű kódírás terén nyújtja.
XPath függvények
Íme néhány, az XPath-tal használható függvény. Rengeteg olyan forrást is talál, amelyek részletesen ismertetik az egyes elérhető funkciókat. Ha ki kell számítania a DOMNodeList-et, vagy össze kell hasonlítania a nodeValue-t (csomópontérték), akkor találhat egy megfelelő XPath függvényt, amely kiküszöböli a felesleges PHP kód használatát.
Ezt már a count() függvény példájából is tudod. Használjuk az id() függvénnyel a megadott ISBN-számú könyvek címét. Ehhez a következő XPath kifejezést kell használni:
id("isbn1234 isbn1235")/title
Vegye figyelembe, hogy a keresett értékeket ne tegye zárójelbe, csak szóközzel válassza el őket. Ezenkívül eszébe se jusson vesszőt hozzáadni:
domDocument); $eredmény = $xpath->query($query); $könyvek = array(); foreach ($eredmény mint $csomópont) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) return $books; )
Az XPath komplex függvényeinek kezelése hihetetlenül egyszerű.
PHP függvények használata XPath-tal
Néha több funkcióra lesz szüksége, amit a szabványos XPath függvények nem tudnak biztosítani. Szerencsére a PHP DOM lehetővé teszi, hogy a natív PHP függvények kölcsönhatásba lépjenek XPath lekérdezésekkel.
Nézzünk egy példát, amely visszaadja a szavak számát a könyv címében. Ebben a legegyszerűbb függvényben a következőket írjuk:
domDocument); $eredmény = $xpath->query($query); $title = $eredmény->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; return str_word_count($cím); )
De az str_word_count() függvényt közvetlenül az XPath kérésbe is belefoglalhatjuk. Ez néhány lépésben megtehető. Először is regisztrálnunk kell a névteret egy XPath objektummal. Az XPath kérésekben a PHP függvényeket a „php:functionString” karakterlánc segítségével hívják meg, amely után a kívánt függvény neve íródik. A névteret a http://php.net/xpath címen is részletesebben tárgyaljuk. Más névtérértékek hibát jeleznek. Ezek után meg kell hívnunk a registerPHPFunctions()-t. Ez a függvény közli a PHP-vel, hogy amikor a hívás a „php:” névtéren keresztül történik, a PHP kezeli ezt a hívást.
Egy példa szintaxis a függvények meghívására a következő lenne:
php:functionString("függvény neve", arg, arg...)
Állítsuk össze mindezt a következő getNumberOfWords() függvénypéldában:
domDocument); //register php névtér $xpath->registerNamespace("php", "http://php.net/xpath"); //most a php függvények meghívhatók xpath kérésben $xpath->registerPHPFunctions(); $query = "php:functionString("szt_szó_szám",(//könyvtár/könyv[@isbn = "$isbn"]/cím))"; return $xpath->evaluate($query); )
Vegye figyelembe, hogy nem kell meghívnia a text() XPath függvényt a csomópont szövegének lekéréséhez. A registerPHPFunctions() metódus ezt automatikussá teszi. Bár a következő példakódsor is érvényes lesz:
php:functionString("szt_szó_szám",(//könyvtár/könyv[@isbn = "$isbn"]/cím))
A PHP függvények regisztrálása nem korlátozódik a PHP-ben szereplő függvényekre. Meghatározhatja saját függvényeit és használhatja azokat az XPath-en belül. Az egyetlen különbség az, hogy a "php:functionString" helyett a "php:function"-t kell használnia.
Írjunk egy függvényt az osztályon kívül, hogy bemutatjuk az alapvető funkciókat. Az általunk használt függvény a szerző "George Orwell" könyveit adja vissza. A lekérdezésbe felvenni kívánt összes csomópont esetében igaznak kell visszatérnie.
nodeValue == "George Orwell"; } !}
A függvénynek átadott argumentum DOM-elemek tömbje. Ez a függvény végigmegy a tömbön, meghatározza a szükséges elemeket, majd felveszi azokat a DOMNodeListbe. Ebben a példában a tesztelt csomópont a /book volt, és a /author segítségével határoztuk meg a szükséges elemeket.
Most létrehozhatjuk a getGeorgeOrwellBooks() függvényt:
domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//könyvtár/könyv1"; $eredmény = $xpath->query($query); $könyvek = array(); foreach($result mint $csomópont) ( $books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) return $books; )
Ha az összehasonlítás() függvény statikus, akkor módosítani kell az XPath lekérdezést:
//könyvtár/könyv
Hogy őszinte legyek, mindezt a funkciót meg lehetett volna valósítani tiszta XPath kóddal. De a példa bemutatja, hogyan bővítheti ki és teheti bonyolultabbá az XPath-lekérdezéseket.
Következtetésképpen
XPath nagyszerű módja annak, hogy csökkentse a kód mennyiségét és növelje feldolgozását XML-lel végzett munka során. A PHP DOM további funkciói lehetővé teszik az XPath funkciók kiterjesztését. Ez egy igazán hasznos dolog, ha használod és belemélyedsz a konkrétumokba, egyre kevesebb kódot kell majd írnod.
Az XPath elérési út-kifejezéseket használ a csomópontok kiválasztásához egy XML-dokumentumban vagy csomópontok halmazában. Csomópont szerint a kiválasztott út (útvonal) vagy szakasz (lépések) mentén.
példány XML dokumentumok
Az alábbi példákban ezt az XML-dokumentumot fogjuk használni.
Válassza ki a csomópontot
Az XPath elérési út kifejezéseket használ az XML-dokumentum csomópontjainak kiválasztásához. Vagy a csomóponton keresztüli útvonal mentén egy lépés kiválasztásához. Az alábbiak a leghasznosabb elérési út kifejezések:
Az alábbi táblázatban bemutatunk néhány kifejezési útvonalat és a kifejezés eredményét:
kifejezés Útvonal | eredmény |
---|---|
könyv Bolt | Jelölje ki a könyv elem összes gyermek csomópontját. |
/ Könyvesbolt | Válassza ki a gyökérelem könyvesboltját. Megjegyzés: Ha egy elérési út perjellel (/) kezdődik, az elérési út mindig az elem abszolút útvonalát reprezentálja! |
könyvesbolt/könyv | Válassza ki a könyvesbolt összes könyves tételéhez tartozó altételeket. |
// Könyv | Jelölje ki az összes könyv alelemet, függetlenül a dokumentumban elfoglalt helyétől. |
könyvesbolt // könyv | Kijelöli az összes olyan könyvelemet, amely nem az elem könyvesboltjának leszármazottja, függetlenül attól, hogy a könyvesboltban és az alatt elhelyezkednek-e. |
// @Lang | Válassza ki az összes Lang nevű tulajdonságot. |
Predikátum(ok)
A predikátum egy adott csomópont vagy csomópont megkeresésére szolgál, amely tartalmazza a megadott értéket.
A predikátum szögletes zárójelben van.
Az alábbi táblázatban felsoroltunk néhány elérési út kifejezést predikátumokkal és a kifejezés eredményét:
kifejezés Útvonal | eredmény |
---|---|
/ Könyvesbolt / könyv | Jelölje ki az első munkafüzet elemhez tartozó alelemeket. |
/Könyvesbolt/könyv [utolsó()] | Válassza ki a könyv utolsó könyv eleméhez tartozó alelemeket. |
/ Könyvesbolt / könyv [utolsó () - 1] | Válassza ki a második könyvelem közös könyvesboltjához kapcsolódó altételeket. |
/Könyvesbolt/könyv [pozíció()<3] | Jelölje ki az alelemekhez tartozó könyvelem első két könyvelemét. |
// Cím [@lang] | Válassza ki az összes olyan attribútumot, amelynek a Langnak van elemcíme. |
// Cím [@ LANG = "eng"] | Válassza ki az összes elemnevet, és ezek az elemek angol attribútumértékkel rendelkeznek. |
/könyvesbolt/könyv | Válassza ki a könyv elem összes könyvelemét, és az ár elem értékét, amelynek nagyobbnak kell lennie 35,00-nál. |
/könyvesbolt/könyv/cím | Jelölje ki a könyv elem összes könyvelem fejlécelemét, amelyben az ár elem értékének 35,00-nál nagyobbnak kell lennie. |
Válassza ki az ismeretlen csomópontokat
XPath helyettesítő karakterek használhatók ismeretlen XML elemek kiválasztására.
Az alábbi táblázatban felsoroltunk néhány elérési út kifejezést, valamint ezen kifejezések eredményeit:
Válasszon több utat
A "|" elérési út kifejezés használata operátort, több utat is választhat.
Az alábbi táblázatban felsoroltunk néhány elérési út kifejezést, valamint ezen kifejezések eredményeit.