Kas yra šis įrankis?
XPath (XML Path Language) yra W3C standartas, skirtas naršyti ir pasirinkti mazgus — elementus, atributus, tekstą — XML dokumente naudojant kompaktišką kelio sintaksę, pvz., `//book[price>30]/title` pasirenka kiekvieną `<title>`, kurio brolinis elementas `<price>` yra didesnis nei 30, bet kurioje dokumento vietoje. Jis naudojamas XSLT stiliaus lapuose, XML validavimo įrankiuose, žiniatinklio scraperiuose, naršyklės automatizavimo karkasuose (Selenium, Playwright) ir daugelio programavimo kalbų XML bibliotekose.
Dabartinė versija, kurią įgyvendina visos pagrindinės naršyklės — Chrome, Firefox, Safari, Edge — yra XPath 1.0, originali 1999 m. W3C rekomendacija. Šis įrankis naudoja tiksliai tą patį natūralų variklį per naršyklės `document.evaluate()` API, todėl rezultatai čia atitinka tai, ką gautumėte iš naršyklės DevTools ar bet kokio JavaScript kodo, veikiančio naršyklėje. Jis neįgyvendina vėlesnių XPath 2.0/3.0/3.1 specifikacijų (jos prideda tokias funkcijas kaip `for`, sekas ir atitikimą reguliariosiomis išraiškomis) — žr. DUK, ką tai reiškia praktiškai.
Išraiška gali grąžinti vieną iš dviejų rezultatų tipų: mazgų rinkinį (nulis ar daugiau atitinkančių elementų, atributų ar teksto mazgų, kuriuos šis įrankis serializuoja ir išvardija po vieną eilutėje kartu su skaičiumi), arba skaliarinę reikšmę — skaičių, eilutę ar loginę reikšmę — kai pati išraiška apskaičiuoja reikšmę, pvz., `count(//book)` arba `//book[1]/title = 'Dune'`.
Kodėl jį naudoti?
- Derinkite XPath išraišką prieš griežtai įkoduodami ją į žiniatinklio scraperį, Selenium/Playwright testą ar XSLT stiliaus lapą.
- Greitai patikrinkite, ar tam tikras XPath pasirenka mazgą, kurio tikitės, iš tikro XML/HTML pavyzdžio.
- Pamatykite tikslius atitikčių skaičius ir serializuotą išvestį, užuot spėję iš kodo.
- Gaukite iškart aiškias klaidas dėl netinkamo XML ar neteisingos XPath sintaksės, o ne paslaptingą klaidų steką.
- 100 % kliento pusėje: jūsų XML ir išraiška niekada nepalieka jūsų naršyklės.
Kaip naudoti
- Įklijuokite arba redaguokite savo XML (ar HTML) įvesties lauke — iš anksto užpildytas pavyzdinis knygyno dokumentas, kad galėtumėte iškart pamatyti, kaip tai veikia.
- Įveskite XPath išraišką išraiškos lauke arba redaguokite iš anksto užpildytą pavyzdį.
- Spustelėkite „Vertinti“ (arba paspauskite Enter išraiškos lauke).
- Perskaitykite atitinkančius mazgus žemiau, su skaičiumi viršuje; skaliarinės reikšmės (skaičiai, eilutės, loginės reikšmės) rodomos tiesiogiai.
- Jei XML ar išraiška netinkama, rezultatus pakeičia konkretus klaidos pranešimas.
Pavyzdys
Įvestis
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]/titleIšvestis
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>Tik 2 iš 3 knygų kaina viršija 30, todėl grąžinami tiksliai 2 <title> elementai — trečia knyga (Gatsby, 12,99 $) teisingai neįtraukiama.
XPath ir CSS selektoriai vienu žvilgsniu
Abi kalbos pasirenka mazgus iš dokumento, tačiau jos sprendžia skirtingas problemas. Naudokite šią lentelę, kad pasirinktumėte tinkamą įrankį konkrečiam pasirinkimui.
| Galimybė | XPath | CSS selektoriai |
|---|---|---|
| Pasirinkti pagal žymą/klasę/id žemyn | Taip | Taip — ir dažniausiai greičiau |
| Pasirinkti pagal matomą/tekstinį turinį | Taip — `contains(text(),'x')` | Ne |
| Pereiti aukštyn iki tėvo/protėvio | Taip — `//div[span]/..` | Ne (`:has()` yra naujesnė dalinė išimtis) |
| Brolinių reikšmių palyginimai (pvz., `price>30`) | Taip | Ne |
| Veikia už naršyklės ribų (serverio XML įrankiai, XSLT) | Taip | Ne — CSS selektoriai skirti naršyklei / DOM |
Susiję įrankiai
Dirbate su struktūrizuotais duomenų formatais? Šie įrankiai puikiai dera su XPath testavimu.
Dažniausiai užduodami klausimai
Kam naudojamas XPath?
XPath pasirenka mazgus — elementus, atributus ar tekstą — iš XML ar HTML dokumento naudodamas kelio sintaksę. Tai pasirinkimo kalba, kuria remiasi XSLT transformacijos, daugelis XML validatorių, ir jis plačiai naudojamas žiniatinklio scrapinge bei naršyklės testų automatizavime (Selenium, Playwright, Cypress) elementams puslapyje surasti, ypač kai vien CSS selektoriais neįmanoma išreikšti reikiamos sąlygos.
XPath ar CSS selektoriai — ką naudoti?
Jie iš dalies sutampa, bet nėra lygiaverčiai. XPath gali pasirinkti tėvinį elementą pagal vaiko turinį (`//div[span='Total']`), pereiti aukštyn iki protėvių ir pasirinkti pagal matomą tekstą (`//button[contains(text(),'Submit')]`) — CSS selektoriai negali judėti aukštyn medyje ir apskritai negali atitikti pagal tekstinį turinį. Jei jums tereikia rinktis pagal žymą, klasę ar ID žemyn dokumente, CSS selektorius paprasčiau rašyti ir jis paprastai vertinamas greičiau. Rinkitės XPath, kai reikia „pasirinkti šio teksto tėvą“ arba „pasirinkti pagal tai, ką elementas sako“, o ne vien pagal jo žymą ar klasę.
Ar šis įrankis palaiko XPath 2.0 ar 3.0 funkcijas?
Ne — kaip ir jokia naršyklė. Naršyklės įgyvendina XPath 1.0 (1999 m. W3C rekomendaciją) per `document.evaluate()`, ir šis įrankis naudoja tiksliai tą patį natūralų variklį, todėl tai atitinka tai, ką gautumėte paleidę tą pačią išraišką naršyklės DevTools ar JavaScript kode. Funkcijos ir galimybės, įvestos XPath 2.0/3.0/3.1 (pvz., `for` išraiškos, sekos ar `matches()` su reguliariosiomis išraiškomis), nėra pasiekiamos — čia veikia tik 1.0 funkcijos, tokios kaip `contains()`, `starts-with()`, `substring()`, `count()`, `position()` ir `last()`.
Kokias dažnas XPath išraiškas turėčiau žinoti?
`//tag` pasirenka kiekvieną `<tag>` bet kurioje dokumento vietoje. `//tag[@attr='value']` pasirenka `<tag>` elementus, kurių atributas `attr` lygus `value`. `//tag[contains(text(),'x')]` pasirenka `<tag>` elementus, kurių tiesioginis tekstas turi `x`. `//tag[1]` pasirenka pirmąjį `<tag>` brolinį elementą kiekviename tėve. `//parent/child` pasirenka `<child>` elementus, kurie yra tiesioginiai `<parent>` vaikai. `count(//tag)` grąžina skaičių, o ne mazgų rinkinį.
Ar šis įrankis apdoroja XML vardų sritis (namespaces)?
Švariai palaikomas tik įprastas atvejis be vardų srities, kuris apima didžiąją dalį ranka rašomo ar scrapinamo XML/HTML. Jei jūsų dokumentas deklaruoja XML vardų sritį (pvz., `xmlns="..."` šakniniame elemente), `document.evaluate` reikalauja vardų sritis atpažįstančios resolver funkcijos, kuri susietų prefiksus su URI, o šis paprastas įrankis to nenustato — išraiškos su vardų sritį turinčiu XML gali grąžinti nulį atitikmenų, net jei atrodo teisingos. Tai žinomas apribojimas, ne klaida: pašalinkite vardų srities deklaraciją iš pavyzdžio arba naudokite local-name() funkciją kaip alternatyvą (pvz., `//*[local-name()='title']`).
Ar mano XML ar XPath išraiška siunčiama į serverį?
Ne. Viskas vyksta lokaliai naudojant jūsų naršyklės integruotą `DOMParser` ir `document.evaluate()` — tą patį variklį, kurį jūsų naršyklė jau naudoja viduje. Niekas, ką įvedate ar įklijuojate, niekada nepalieka jūsų įrenginio.