Mis see tööriist on?
XPath (XML Path Language) on W3C standard sõlmede — elementide, atribuutide, teksti — navigeerimiseks ja valimiseks XML-dokumendis, kasutades kompaktset teekonnalaadset süntaksit, nt `//book[price>30]/title` valib iga `<title>`, mille vennaselement `<price>` on suurem kui 30, ükskõik kus dokumendis. Seda kasutavad XSLT-stiililehed, XML-i valideerimistööriistad, veebikraapijad, brauseriautomatiseerimise raamistikud (Selenium, Playwright) ja paljude programmeerimiskeelte XML-teegid.
Praegune versioon, mida rakendavad kõik peamised brauserid — Chrome, Firefox, Safari, Edge —, on XPath 1.0, algne 1999. aasta W3C soovitus. See tööriist kasutab täpselt sama natiivset mootorit brauseri `document.evaluate()` API kaudu, nii et siinsed tulemused vastavad sellele, mida saaksid brauseri arendajatööriistadest või mis tahes brauseris töötavast JavaScriptist. See ei rakenda hilisemaid spetsifikatsioone XPath 2.0/3.0/3.1 (need lisavad funktsioone nagu `for`, jadad ja regulaaravaldiste sobitamine) — vaata KKK-st, mida see praktikas tähendab.
Avaldis võib tagastada ühte kahest tulemusetüübist: sõlmede kogumi (null või rohkem vastavat elementi, atribuuti või tekstisõlme, mille see tööriist serialiseerib ja loetleb ühe realt koos arvuga), või skalaarväärtuse — arvu, stringi või tõeväärtuse —, kui avaldis ise arvutab väärtuse, nagu `count(//book)` või `//book[1]/title = 'Dune'`.
Miks seda kasutada?
- Silu XPath-avaldist enne selle kõvakodeerimist veebikraapijasse, Selenium/Playwright testi või XSLT-stiililehte.
- Kontrolli kiiresti, kas antud XPath valib oodatud sõlme päris XML/HTML näidisest.
- Näe täpset vastete arvu ja serialiseeritud väljundit, selle asemel et koodi järgi arvata.
- Saa kohe arusaadavaid vigu vigase XML-i või kehtetu XPath-süntaksi korral, selle asemel et krüptiline pinujälg.
- 100% klientpoolne: sinu XML ja avaldis ei lahku kunagi sinu brauserist.
Kuidas kasutada
- Kleebi või muuda oma XML (või HTML) sisestusväljal — näidis-raamatupoe dokument on eeltäidetud, et näeksid kohe, kuidas see töötab.
- Kirjuta avaldiseväljale XPath-avaldis või muuda eeltäidetud näidet.
- Klõpsa "Hinda" (või vajuta avaldiseväljal Enter).
- Loe allpool vastavaid sõlmi koos arvuga ülaosas; skalaartulemused (arvud, stringid, tõeväärtused) kuvatakse otse.
- Kui XML või avaldis on vigane, asendab tulemused konkreetne veateade.
Näide
Sisend
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]/titleTulemus
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>Ainult 2 raamatul kolmest on hind üle 30, seega tagastatakse täpselt 2 <title>-elementi — kolmas raamat (Gatsby, 12,99 $) jäetakse õigesti välja.
XPath vs CSS-valijad ühe pilguga
Mõlemad keeled valivad sõlmi dokumendist, kuid need lahendavad erinevaid probleeme. Kasuta seda tabelit, et valida antud valiku jaoks õige tööriist.
| Võimekus | XPath | CSS-valijad |
|---|---|---|
| Valimine sildi/klassi/ID järgi allapoole | Jah | Jah — ja tavaliselt kiiremini |
| Valimine nähtava/tekstisisu järgi | Jah — `contains(text(),'x')` | Ei |
| Liikumine üles vanema/esivanema poole | Jah — `//div[span]/..` | Ei (`:has()` on uuem osaline erand) |
| Vennaselementide väärtuste võrdlused (nt `price>30`) | Jah | Ei |
| Töötab väljaspool brauserit (serveripoolsed XML-tööriistad, XSLT) | Jah | Ei — CSS-valijad on brauseri/DOM-i spetsiifilised |
Seotud tööriistad
Töötad struktureeritud andmevormingutega? Need tööriistad sobivad hästi kokku XPath-i testimisega.
Korduma kippuvad küsimused
Milleks XPath-i kasutatakse?
XPath valib sõlmi — elemente, atribuute või teksti — XML- või HTML-dokumendist, kasutades teekonnasüntaksit. See on valikukeel XSLT-teisenduste, paljude XML-valideerijate taga ning seda kasutatakse laialdaselt veebikraapimises ja brauseripõhises testiautomaatikas (Selenium, Playwright, Cypress) elementide leidmiseks lehel, eriti kui pelgalt CSS-valijad ei suuda vajalikku tingimust väljendada.
XPath vs CSS-valijad — kumba kasutada?
Need kattuvad, kuid ei ole samaväärsed. XPath saab valida vanemelemendi lapse sisu põhjal (`//div[span='Total']`), liikuda üles esivanemate poole ja valida nähtava teksti järgi (`//button[contains(text(),'Submit')]`) — CSS-valijad ei saa puus üles liikuda ega saa üldse tekstisisu järgi sobitada. Kui valid lihtsalt sildi, klassi või ID järgi dokumendis allapoole liikudes, on CSS-valijaid lihtsam kirjutada ja need on üldiselt kiiremini hinnatavad. Kasuta XPath-i just siis, kui vajad "selle teksti vanema valimist" või "valimist selle järgi, mida element ütleb", mitte ainult selle järgi, mis silt või klass sellel on.
Kas see tööriist toetab XPath 2.0 või 3.0 funktsioone?
Ei — ega ka ükski brauser. Brauserid rakendavad XPath 1.0 (1999. aasta W3C soovitus) `document.evaluate()` kaudu ja see tööriist kasutab täpselt sama natiivset mootorit, seega on see täpne vastavuses sellega, mida saaksid sama avaldise käivitamisel brauseri arendajatööriistades või JavaScriptis. XPath 2.0/3.0/3.1 versioonis kasutusele võetud funktsioonid ja omadused (nagu `for`-avaldised, jadad või `matches()` regulaaravaldistega) pole siin saadaval — töötavad ainult 1.0 funktsioonid nagu `contains()`, `starts-with()`, `substring()`, `count()`, `position()` ja `last()`.
Milliseid levinud XPath-avaldisi peaksin teadma?
`//tag` valib iga `<tag>` ükskõik kus dokumendis. `//tag[@attr='value']` valib `<tag>` elemendid, mille atribuut `attr` võrdub väärtusega `value`. `//tag[contains(text(),'x')]` valib `<tag>` elemendid, mille otsene tekst sisaldab `x`. `//tag[1]` valib iga vanema esimese `<tag>` vennaselemendi. `//parent/child` valib `<child>` elemendid, mis on `<parent>` otsesed lapsed. `count(//tag)` tagastab arvu sõlmede kogumi asemel.
Kas see tööriist toetab XML-i nimeruume?
Puhtalt toetatakse ainult tavalist nimeruumita juhtu, mis katab valdava enamuse käsitsi kirjutatud või kraabitud XML/HTML dokumentidest. Kui sinu dokument deklareerib XML-i nimeruumi (nt `xmlns="..."` juurelemendil), nõuab `document.evaluate` nimeruumidest teadlikku resolver-funktsiooni, mis kaardistab prefiksid URI-deks — seda see lihtne tööriist ei seadista — nimeruumidega XML-i vastu suunatud avaldised võivad tagastada null vastet, isegi kui need näivad õiged. See on teadaolev piirang, mitte viga: eemalda oma näidisest nimeruumi deklaratsioon või kasuta alternatiivina local-name() funktsiooni (nt `//*[local-name()='title']`).
Kas mu XML või XPath-avaldis saadetakse serverisse?
Ei. Kõik töötab lokaalselt, kasutades sinu brauseri sisseehitatud `DOMParser`-it ja `document.evaluate()`-i — sama mootorit, mida su brauser juba sisemiselt kasutab. Miski, mida kirjutad või kleebid, ei lahku kunagi sinu seadmest.