Mikä tämä työkalu on?
XPath (XML Path Language) on W3C-standardi, jolla navigoidaan ja valitaan solmuja — elementtejä, attribuutteja, tekstiä — XML-dokumentin sisältä tiiviillä polunkaltaisella syntaksilla, esim. `//book[price>30]/title` valitsee jokaisen `<title>`-elementin, jonka sisarelementin `<price>` arvo on suurempi kuin 30, missä tahansa dokumentissa. Sitä käyttävät XSLT-tyylitiedostot, XML-validointityökalut, verkkokaapijat, selainautomaatiokehykset (Selenium, Playwright) ja monien ohjelmointikielten XML-kirjastot.
Kaikkien suurten selainten — Chrome, Firefox, Safari, Edge — nykyisin toteuttama versio on XPath 1.0, alkuperäinen vuoden 1999 W3C-suositus. Tämä työkalu käyttää juuri tätä natiivimoottoria selaimen `document.evaluate()`-rajapinnan kautta, joten tulokset vastaavat sitä, mitä saisit selaimen kehittäjätyökaluista tai mistä tahansa selaimessa ajettavasta JavaScriptistä. Se ei toteuta myöhempiä XPath 2.0/3.0/3.1 -määrityksiä (ne lisäävät mm. `for`-lausekkeita, sekvenssejä ja regex-täsmäytystä) — katso UKK, mitä tämä käytännössä tarkoittaa.
Lauseke voi palauttaa kahdenlaisia tuloksia: solmujoukon (node-set, nolla tai useampi täsmäävä elementti, attribuutti tai tekstisolmu, jotka tämä työkalu serialisoi ja listaa yksi riviä kohden määrän kera) tai skalaariarvon — luvun, merkkijonon tai totuusarvon — kun lauseke itse laskee arvon, kuten `count(//book)` tai `//book[1]/title = 'Dune'`.
Miksi käyttää sitä?
- Debuggaa XPath-lauseke ennen kuin kovakoodaat sen verkkokaapijaan, Selenium/Playwright-testiin tai XSLT-tyylitiedostoon.
- Tarkista nopeasti, valitseeko tietty XPath odotetun solmun oikeasta XML/HTML-näytteestä.
- Näe tarkat osumamäärät ja serialisoitu tuloste sen sijaan, että arvailisit koodin perusteella.
- Saat välittömiä, luettavia virheilmoituksia virheellisestä XML:stä tai virheellisestä XPath-syntaksista sekavan pinojäljen sijaan.
- 100 % selainpohjainen: XML- ja lauseketietosi eivät koskaan poistu selaimestasi.
Käyttöohje
- Liitä tai muokkaa XML- (tai HTML-) sisältöäsi syötekenttään — esimerkkikirjakauppadokumentti on valmiiksi täytetty, jotta näet toiminnan heti.
- Kirjoita XPath-lauseke lausekekenttään tai muokkaa valmiiksi täytettyä esimerkkiä.
- Napsauta "Evaluate" (tai paina Enter lausekekentässä).
- Lue täsmäävät solmut alta, määrä näkyy yläreunassa; skalaaritulokset (luvut, merkkijonot, totuusarvot) näytetään suoraan.
- Jos XML tai lauseke on virheellinen, tulosten tilalle tulee tarkka virheilmoitus.
Esimerkki
Syöte
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]/titleTuloste
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>Vain kahden kolmesta kirjasta hinta on yli 30, joten tarkalleen 2 <title>-elementtiä palautetaan — kolmas kirja (Gatsby, 12,99 $) jää oikein pois.
XPath vs. CSS-valitsimet yhdellä silmäyksellä
Molemmat kielet valitsevat solmuja dokumentista, mutta ne ratkaisevat eri ongelmia. Käytä tätä taulukkoa valitaksesi oikean työkalun kuhunkin valintaan.
| Ominaisuus | XPath | CSS-valitsimet |
|---|---|---|
| Valinta tagin/luokan/id:n perusteella alaspäin | Kyllä | Kyllä — ja yleensä nopeampi |
| Valinta näkyvän tekstisisällön perusteella | Kyllä — `contains(text(),'x')` | Ei |
| Kulku ylöspäin vanhempaan/esivanhempaan | Kyllä — `//div[span]/..` | Ei (`:has()` on uudempi osittainen poikkeus) |
| Sisarusarvojen vertailu (esim. `price>30`) | Kyllä | Ei |
| Toimii selaimen ulkopuolella (palvelinpuolen XML-työkalut, XSLT) | Kyllä | Ei — CSS-valitsimet ovat selain-/DOM-kohtaisia |
Aiheeseen liittyvät työkalut
Työskenteletkö rakenteisten dataformaattien parissa? Nämä työkalut sopivat hyvin yhteen XPath-testauksen kanssa.
Usein kysytyt kysymykset
Mihin XPathia käytetään?
XPath valitsee solmuja — elementtejä, attribuutteja tai tekstiä — XML- tai HTML-dokumentista polkusyntaksin avulla. Se on XSLT-muunnosten taustalla oleva valintakieli, sitä käyttävät monet XML-validaattorit, ja se on laajasti käytössä verkkokaapinnassa ja selaintestiautomaatiossa (Selenium, Playwright, Cypress) elementtien paikantamiseen sivulla, erityisesti silloin kun pelkät CSS-valitsimet eivät riitä ilmaisemaan tarvittavaa ehtoa.
XPath vai CSS-valitsimet — kumpaa käyttää?
Ne menevät osittain päällekkäin, mutta eivät ole samanarvoisia. XPath pystyy valitsemaan vanhemman lapsen sisällön perusteella (`//div[span='Total']`), kulkemaan ylöspäin esivanhempiin ja valitsemaan näkyvän tekstin perusteella (`//button[contains(text(),'Submit')]`) — CSS-valitsimet eivät voi kulkea puussa ylöspäin eivätkä täsmätä tekstisisältöön lainkaan. Jos valitset vain tagin, luokan tai id:n perusteella alaspäin dokumentissa, CSS-valitsimet ovat yksinkertaisempia kirjoittaa ja yleensä nopeampia arvioida. Käytä XPathia erityisesti silloin, kun tarvitset "valitse tämän tekstin vanhempi" tai "valitse sen mukaan, mitä elementti sanoo" -tyyppisiä valintoja, et pelkästään tagin tai luokan perusteella tehtäviä.
Tukeeko tämä työkalu XPath 2.0- tai 3.0-funktioita?
Ei — eikä mikään selain tue. Selaimet toteuttavat XPath 1.0:n (vuoden 1999 W3C-suosituksen) `document.evaluate()`-rajapinnan kautta, ja tämä työkalu käyttää juuri tätä natiivimoottoria, joten se vastaa tarkasti sitä, mitä saisit ajamalla saman lausekkeen selaimen kehittäjätyökaluissa tai JavaScriptissä. XPath 2.0/3.0/3.1:ssä esitellyt funktiot ja ominaisuudet (kuten `for`-lausekkeet, sekvenssit tai regex-pohjainen `matches()`) eivät ole käytettävissä — täällä toimivat vain 1.0-funktiot kuten `contains()`, `starts-with()`, `substring()`, `count()`, `position()` ja `last()`.
Mitkä ovat yleisiä XPath-lausekkeita, jotka kannattaa osata?
`//tag` valitsee jokaisen `<tag>`-elementin dokumentissa. `//tag[@attr='value']` valitsee `<tag>`-elementit, joiden `attr`-attribuutti on `value`. `//tag[contains(text(),'x')]` valitsee `<tag>`-elementit, joiden suora teksti sisältää merkkijonon `x`. `//tag[1]` valitsee ensimmäisen `<tag>`-sisaruksen jokaisessa vanhemmassa. `//parent/child` valitsee `<child>`-elementit, jotka ovat `<parent>`-elementin suoria lapsia. `count(//tag)` palauttaa luvun solmujoukon sijaan.
Käsitteleekö tämä työkalu XML-nimiavaruuksia?
Vain tavallinen nimiavaruudeton tapaus tuetaan siististi, ja se kattaa valtaosan käsin kirjoitetusta tai kaapitusta XML/HTML-sisällöstä. Jos dokumenttisi määrittelee XML-nimiavaruuden (esim. `xmlns="..."` juurielementissä), `document.evaluate` vaatii nimiavaruustietoisen resolver-funktion, joka kuvaa etuliitteet URI:iksi — tätä ei ole rakennettu tähän yksinkertaiseen työkaluun, joten nimiavaruudellista XML:ää vasten ajetut lausekkeet voivat palauttaa nolla osumaa, vaikka ne näyttäisivät oikeilta. Tämä on tunnettu rajoitus, ei virhe: poista nimiavaruusmäärittely näytteestäsi tai käytä kiertotienä local-name()-funktiota (esim. `//*[local-name()='title']`).
Lähetetäänkö XML- tai XPath-lausekkeeni palvelimelle?
Ei. Kaikki tapahtuu paikallisesti selaimesi sisäänrakennetulla `DOMParser`- ja `document.evaluate()`-moottorilla — samalla moottorilla, jota selaimesi jo käyttää sisäisesti. Mikään kirjoittamasi tai liittämäsi ei koskaan poistu laitteeltasi.