Mi ez az eszköz?
Az XPath (XML Path Language) egy W3C szabvány csomópontok — elemek, attribútumok, szöveg — navigálására és kiválasztására egy XML dokumentumon belül, tömör, útvonalszerű szintaxis segítségével, például a `//book[price>30]/title` minden olyan `<title>` elemet kiválaszt, amelynek testvér `<price>` eleme nagyobb 30-nál, bárhol a dokumentumban. XSLT stíluslapok, XML-ellenőrző eszközök, webes lekaparó eszközök, böngésző-automatizálási keretrendszerek (Selenium, Playwright) és számos programozási nyelv XML-könyvtára használja.
A jelenlegi verzió, amelyet minden nagyobb böngésző — Chrome, Firefox, Safari, Edge — implementál, az XPath 1.0, az eredeti, 1999-es W3C ajánlás. Ez az eszköz pontosan ezt a natív motort használja a böngésző `document.evaluate()` API-ján keresztül, így az itt kapott eredmények megegyeznek azzal, amit a böngésző fejlesztői eszközeiben vagy bármilyen, böngészőben futó JavaScript kódban kapna. Nem valósítja meg a későbbi XPath 2.0/3.0/3.1 specifikációkat (ezek olyan függvényeket adnak hozzá, mint a `for`, szekvenciák és regex illesztés) — a gyakorlati jelentésről lásd a GYIK-et.
Egy kifejezés kétféle eredményt adhat vissza: csomóponthalmazt (node-set — nulla vagy több illeszkedő elem, attribútum vagy szövegcsomópont, amelyeket ez az eszköz szerializál és soronként egyet listáz, számmal együtt), vagy skaláris értéket — számot, karakterláncot vagy logikai értéket — amikor maga a kifejezés egy értéket számít ki, mint a `count(//book)` vagy a `//book[1]/title = 'Dune'`.
Miért érdemes használni?
- Hibakeresés egy XPath kifejezésben, mielőtt beépítené egy webes lekaparó eszközbe, Selenium/Playwright tesztbe vagy XSLT stíluslapba.
- Gyorsan ellenőrizze, hogy egy adott XPath valóban a várt csomópontot választja-e ki egy valós XML/HTML mintából.
- Pontos találati számokat és szerializált kimenetet lásson, ahelyett hogy a kódból kellene találgatnia.
- Azonnali, olvasható hibaüzeneteket kapjon hibás XML vagy érvénytelen XPath szintaxis esetén, kriptikus stack trace helyett.
- 100%-ban kliensoldali: az Ön XML-je és kifejezése soha nem hagyja el a böngészőjét.
Használati útmutató
- Illessze be vagy szerkessze az XML-t (vagy HTML-t) a beviteli mezőben — egy minta könyvesbolt-dokumentum előre ki van töltve, hogy azonnal láthassa működés közben.
- Írjon be egy XPath kifejezést a kifejezésmezőbe, vagy szerkessze az előre kitöltött példát.
- Kattintson az „Evaluate” gombra (vagy nyomjon Entert a kifejezésmezőben).
- Olvassa el az alább megjelenő illeszkedő csomópontokat, a tetején látható számmal; a skaláris eredmények (számok, karakterláncok, logikai értékek) közvetlenül megjelennek.
- Ha az XML vagy a kifejezés érvénytelen, egy konkrét hibaüzenet váltja fel az eredményeket.
Példa
Bemenet
XML:
<bookstore>
<book><title>The Great Gatsby</title><price>12.99</price></book>
<book><title>Learning XPath</title><price>34.50</price></book>
<book><title>Dune</title><price>45.00</price></book>
</bookstore>
XPath: //book[price>30]/titleKimenet
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>A 3 könyv közül csak 2 ára haladja meg a 30-at, így pontosan 2 <title> elem kerül visszaadásra — a harmadik könyv (Gatsby, 12,99 $) helyesen kimarad.
XPath és CSS szelektorok összehasonlítva
Mindkét nyelv csomópontokat választ ki egy dokumentumból, de eltérő problémákat oldanak meg. Használja ezt a táblázatot a megfelelő eszköz kiválasztásához egy adott feladathoz.
| Képesség | XPath | CSS szelektorok |
|---|---|---|
| Kiválasztás címke/osztály/azonosító alapján lefelé | Igen | Igen — és általában gyorsabb |
| Kiválasztás látható/szöveges tartalom alapján | Igen — `contains(text(),'x')` | Nem |
| Felfelé haladás a szülőhöz/őshöz | Igen — `//div[span]/..` | Nem (a `:has()` egy újabb, részleges kivétel) |
| Testvérérték-összehasonlítás (pl. `price>30`) | Igen | Nem |
| Böngészőn kívül is működik (szerveroldali XML eszközök, XSLT) | Igen | Nem — a CSS szelektorok böngésző-/DOM-specifikusak |
Kapcsolódó eszközök
Strukturált adatformátumokkal dolgozik? Ezek az eszközök jól kiegészítik az XPath tesztelést.
Gyakori kérdések
Mire használható az XPath?
Az XPath csomópontokat — elemeket, attribútumokat vagy szöveget — választ ki egy XML vagy HTML dokumentumból útvonal-szintaxis segítségével. Ez a kiválasztási nyelv áll az XSLT transzformációk és sok XML-ellenőrző eszköz mögött, és széles körben használják webes lekaparásban és böngésző-tesztautomatizálásban (Selenium, Playwright, Cypress) elemek megkeresésére egy oldalon, különösen akkor, amikor önmagukban a CSS szelektorok nem tudják kifejezni a szükséges feltételt.
XPath vagy CSS szelektorok — melyiket használjam?
Részben átfedik egymást, de nem egyenértékűek. Az XPath ki tud választani egy szülőt egy gyermek tartalma alapján (`//div[span='Total']`), fel tud menni az ősökhöz, és látható szöveg alapján is tud választani (`//button[contains(text(),'Submit')]`) — a CSS szelektorok nem tudnak felfelé menni a fában, és egyáltalán nem tudnak szövegtartalom alapján illeszkedni. Ha csak címke, osztály vagy azonosító alapján választ, lefelé haladva a dokumentumban, a CSS szelektorok egyszerűbben írhatók és általában gyorsabban kiértékelhetők. Kifejezetten akkor nyúljon XPath-hoz, amikor „válaszd ki ennek a szövegnek a szülőjét” vagy „válassz aszerint, mit mond az elem” típusú műveletre van szüksége, nem csak arra, hogy mi a címkéje vagy osztálya.
Támogatja ez az eszköz az XPath 2.0 vagy 3.0 függvényeket?
Nem — ahogy egyetlen böngésző sem. A böngészők az XPath 1.0-t (az 1999-es W3C ajánlást) valósítják meg a `document.evaluate()` révén, és ez az eszköz pontosan ezt a natív motort használja, így pontosan azt adja vissza, amit ugyanannak a kifejezésnek a böngésző fejlesztői eszközeiben vagy JavaScriptben történő futtatásakor kapna. Az XPath 2.0/3.0/3.1-ben bevezetett függvények és funkciók (mint a `for` kifejezések, szekvenciák vagy a regexet használó `matches()`) nem érhetők el — itt csak az 1.0-s függvények, például a `contains()`, `starts-with()`, `substring()`, `count()`, `position()` és `last()` működnek.
Melyek azok a gyakori XPath kifejezések, amelyeket érdemes ismerni?
A `//tag` minden `<tag>` elemet kiválaszt a dokumentumban, bárhol. A `//tag[@attr='value']` azokat a `<tag>` elemeket választja ki, amelyek `attr` attribútuma egyenlő `value`-val. A `//tag[contains(text(),'x')]` azokat a `<tag>` elemeket választja ki, amelyek közvetlen szövege tartalmazza az `x`-et. A `//tag[1]` minden szülőn belül az első `<tag>` testvérelemet választja ki. A `//parent/child` azokat a `<child>` elemeket választja ki, amelyek közvetlenül a `<parent>` gyermekei. A `count(//tag)` számot ad vissza csomóponthalmaz helyett.
Kezeli ez az eszköz az XML névtereket?
Csak a gyakori, névtér nélküli eset támogatott zökkenőmentesen, ami a kézzel írt vagy lekapart XML/HTML tartalmak túlnyomó többségét lefedi. Ha a dokumentum XML névteret deklarál (pl. `xmlns="..."` a gyökérelemen), a `document.evaluate` egy névtér-tudatos resolver függvényt igényel, amely előtagokat URI-khez rendel, ezt pedig ez az egyszerű eszköz nem állítja be — a névterekkel rendelkező XML-re futtatott kifejezések nulla találatot adhatnak vissza akkor is, ha helyesnek tűnnek. Ez ismert korlátozás, nem hiba: távolítsa el a névtér-deklarációt a mintájából, vagy megoldásként használja a local-name() függvényt (pl. `//*[local-name()='title']`).
Elküldi az eszköz az XML-emet vagy XPath kifejezésemet egy szerverre?
Nem. Minden helyileg fut, a böngésző beépített `DOMParser` és `document.evaluate()` motorját használva — ugyanazt a motort, amelyet a böngészője már belsőleg is használ. Amit beír vagy beilleszt, soha nem hagyja el az eszközét.