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:

Harry Potter J. K. Rowling 2005 29.99

Példa csomópontokra a fenti XML-dokumentumban:

(gyökér elem) J. K. Rowling (csomópont) lang="en"(tulajdonság)

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:

Harry Potter J. K. Rowling 2005 29.99

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:

Harry Potter J. K. Rowling 2005 29.99

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:

Harry Potter J. K. Rowling 2005 29.99

Ő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:

Harry Potter J. K. Rowling 2005 29.99

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:

Harry Potter J. K. Rowling 2005 29.99

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.

Harry Potter 29.99 XML tanulás 39.95

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.

Harry Potter 29.99 XML tanulás 39.95

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:

Mindennapi olasz 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 XML tanulás Erik T. Ray 2003 39.95

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ő”
ul/li , ul/li - elemek listája a 3. számtól kezdve és fordítva.

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:

Könyv Egy szerző Borzalom első fejezet Egy másik könyv Egy másik szerző Tudományos-fantasztikus első fejezet

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.


Harry Potter
29.99


XML tanulás
39.95

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 Útvonaleredmény
könyv BoltJelö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önyvVálassza ki a könyvesbolt összes könyves tételéhez tartozó altételeket.
// KönyvJelölje ki az összes könyv alelemet, függetlenül a dokumentumban elfoglalt helyétől.
könyvesbolt // könyvKijelö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.
// @LangVá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 Útvonaleredmény
/ Könyvesbolt / könyvJelö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önyvVá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ímJelö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.