XPath
XPath, XML Path Language, je upitni jezik za odabir čvorova iz XML dokumenta. Naknadno, XPath može da se koristi da izračunava vrednosti(na primer niski, brojeva, ili buleanskih vrednosti) iz sadržaja XML dokumenta. XPath je definisan od strane WWW konzorcijuma.[1]
Pregled uredi
XPath jezik se zasniva na predstavljanju XML dokumenta kao stabla, i pruža mogućnost kretanja po stablu, odabirajući čvorove raznim kriterijumima.[2][3] Kolikvijalno (ali ne i u zvaničnim specifikacijama), jedan XPath izraz se naziva jednim „Xpath-om“.
U početku motivisan željom da se nađe zajednička sintaksa i model ponašanja između Xpointera i XSLT-a, podskupovi Xpath upitnog jezika se koriste u drugim W3C specifikacijama kao što su W3C XML Schema, XForms i skup tagova za internacionalizaicju (Internationalization Tag Set (ITS)).
XPath su usvojile razne alatke i biblioteke za obradu XML-a, od kojih mnoge nude CSS selektore, još jedan W3C standard, kao prostiju alternativu za XPath.
Verzije uredi
Trenutno postoje tri verzije XPath-a u upotrebi. Poslednja verzija jezika (od 10.4.2014) je 3.0, ali XPath 1.0 je najrasporstranjenija verzija.[1]
- XPath 1.0 je postao preporuka 16. novembra 1999. godine i u širokoj je upotrebi, bilo samostalan (pozivan preko API-a jezika kao što su Java, C#, pajton ili javaskript), ili ugrađen u jezike kao što su XSLT, XProc XML Schema ili Xforms.
- XPath 2.0 je postao preporuka 23. januara 2007. godine. Izvestan broj implementcaija postoji, ali one nisu zastupljene kao XPath 1.0. Specifikacija jezika XPath 2.0 je mnogo veća od specifikacije XPath 1.0, i ona menja neke od osnivnih koncepata tog jezika, koao što je, na primer, sistem tipova.
- Najprimetnija promena je to što je XPath 2.0 izgrađen oko модела података XQuery-a и XPath-a koji ima mnogo bogatiji sistem tipova.[4]Sada se svaka vrednost predstavlja kao niz(pojedniačna atmoička vrednost ili čvor se posmatra kao niz dužine jedan). Skupovi čvorova iz XPath 1.0 su zamenjeni sa nizovima čvorova, koji mogu biti u bilo kom poretku.
- Da bi podržavao bogatije skupove tipova, XPath 2.0 nudi uveliko proširen skup funkcija i operatora.
- XPath 2.0 je zapravo podskup od XQuery 1.0. Oni dele isti model podataka (XDM). On nudi
for
izraz koji je skraćena verzija „FLWOR“ izraza iz XQuery-a. Moguće je opisati jezik navodeći delove XQuery-a koje on izostavlja: glavni primeri su upitni prolog, konstruktori elemenata i atributa, ostatak „FLWOR“ sintakse, itypeswitch
izraz.
- XPath 3.0 je postao preporuka 8. aprila 2014. godine.[5] najznačajnije novo svojstvo i je podrška za posmatranje funkcija kao „prvoklasnih“ vrednosti. XPath 3.0 je podskup XQuery 3.0-a, i najnovije implementacije (april 2014.) postoje kao deo „pogona“.
Sintaksa i semantika (XPath 1.0) uredi
Najvažnija vrsta izraza u XPath-u je putanja lociranja. Putanja lociranja se sastoji od niza koraka lociranja. Svaki korak lociranja ima tri komponente:
Vrednost XPath izraza se izračunava u odnosu na kontekstni čvor. Specifikator ose kao što je 'dete' ili 'potomak' navodi pravac obilaska van kontekstnog čvora. Čvor test i predikat se koriste da izdvoje sve čvorove koje navede specifikator ose: na primer, čvor test 'A' zahteva da svi čvorovi koji se obiđu imaju oznaku 'A'. Predikat se može iskoristi da navede da izabrani čvorovi imaju neke osobine, koje su navedene od strane samih XPath izraza.
XPath sintaksa dolazi u dva stila: Skraćena sintaksa, koja je kompaktnija i omogućava da se XPath izrazi pišu i čitaju sa lakoćom koristeći intuitivne i, u mnogim slučajevima, poznate karaktere i konstrukte. Potpuna sintaksa je opsežnija, ali omogućava navođenje više opcija, i deskriptivija je ako se pažljivo čita.
Skraćena sintaksa uredi
Kompaktna notacija omogućava mnoge uobičajne izraze i skraćenice u prostijim slučajevima. Za dat XML koji sadrži
<A>
<B>
<C/>
</B>
</A>
najprostiji XPath izraz je oblika
/A/B/C
i on bira sve elemente C koji su deca svih elemenata B koji su deca elementa A koji formira najobuhvatnji element XML dokumenta. XPath sintaksa je osmišljena da oponaša URI i uniksoliku sintaksu putanje datoteka.
Složeniji izrazi se mogu napraviti navodeći neku osu različitu od podrazumevane 'dete' ose, čvor test različit od običnog imena ili predikata koji mogu biti zapisani u uglastim zagradama posle svakog koraka. Na primer, izraz
A//B/*[1]
bira prvo dete ('*[1]
'), nezavisno od imena, svakog elementa B koji je i sam dete ili dalji potomak ('//
') elementa A koji je dete tekućeg sadržajnog čvora (izraz ne počinje sa '/
'). Treba primetiti da predikat [1]
tešnje određuje nego /
operator. Da bi se izabrao prvi čvor kog određuje izraz A//B/*
, treba napisati (A//B/*)[1]
. Još treba primetiti da, indeksi u XPath predikatima (tehnički, 'udaljenosti položaja' XPath skupova čvorova), počinju od 1, a ne od 0, kao što je uobičajno u jezicima kao ćto su C ili Java.
Potpuna Sintaksa uredi
Napisani potpunom sintaksom, dva gorenavedena primera bi izgledala ovako
/child::A/child::B/child::C
child::A/descendant-or-self::node()/child::B/child::*[position()=1]
Ovde je u svakom koraku izraza eksplicitno navedena osa (npr. child
ili descendant-or-self
), praćena sa ::
, a zatim sa čvor testom, kao što je A
ili node()
, iz gorenavedenih primera.
Osni specifikatori uredi
Osni specifikatori ukazuju na pravac navigacije u okviru stabla reprezentacije XML dokumenta. Osni specifikatori su:
Puna Sintaksa | Skraćena Sintaksa | Beleške |
---|---|---|
ancestor |
||
ancestor-or-self |
||
attribute
|
@
|
@abc je skraćenica od attribute::abc
|
child |
xyz je skraćenica od child::xyz
| |
descendant |
||
descendant-or-self
|
//
|
// je skraćenica od /descendant-or-self::node()/
|
following |
||
following-sibling |
||
namespace |
||
parent
|
..
|
.. je skraćenica od parent::node()
|
preceding |
||
preceding-sibling |
||
self
|
.
|
. je skraćenica od self::node()
|
Primer korišćenja attribute specifikatora u skraćenom sintaksnom obliku, //a/@href
odabira atribut koji se zove href
u elementu a
bilo gde u stablu reprezentacije dokumenta.
Izraz . (skraćeni zapis od self::node()) je najkorišćeniji u okviru predikata i referiše na trenutno izabrani čvor.
Na primer, h3[.='Pozdravna poruka']
odabira element h3
u trenutnom kontekstu, čija tekst sadržina je Pozdravna poruka
.
Čvor testovi uredi
Čvor testovi mogu da se sastoje od imena određenih čvorova ili opštije, od izraza. U slučaju XML dokumenta, čiji je prefiks imenskog prostora gs
definisan, //gs:enquiry
će pronaći sve enquiry
elemente u tom imenskom prostoru, i //gs:*
će pronaći sve elemente, ne uzimajući u obzir lokalno ime, u tom imenskom prostoru.
Drugi formati čvor testova:
- comment()
- pronalazi XML čvor komentara, na primer
<!-- Komentar -->
- text()
- pronalazi čvor tekstualnog tipa, na primer
hello world
u<k>hello<m> world</m></k>
- processing-instruction()
- pronalazi XML naredbu obrade kao što je
<?php echo $a; ?>
. U ovom slučaju,processing-instruction('php')
bi odgovaralo. - node()
- pronalazi bilo koji čvor iz skupa svih čvorova.
Predikati uredi
Predikati, zapisivani kao izrazi u kockastim zagradama, mogu se koristiti za restrikciju skupa čvorova radi odabira onih za koje je odrećeni uslov ispunjen. Na primer a[@href='help.php']
će odabrati one elemente a
(među decom kontekstnog čvora) koji imaju href
atribut čija je vrednost help.php
.
Ne postoji ograničenje broja predikata po koraku, i oni ne moraju biti ograničeni do poslednjeg koraka ()u XPath(). Predikati mogu biti ugnježdeni do bilo koje dubine. Putanje navedene u predikatima počinju od konteksta tekućeg koraka( na primer od neposredno prethodnog testa čvora) i ne menjaju taj kontekst. Svi predikati moraju biti zadovoljeni da bi došlo do ()poklapanja().
Kada je vrednost predikata numerička, ona se tumači kao test na poziciji čvora. Tako p[1]
odabira prvo dete koje je p
element, dok p[last()]
odabira poslednje.
U drugim slučajevima, vrednost predikata je automatski pretvorena u boolean. Kada se izvrši provera predikata u skupu čvorova, rezultat je istinit ukoliko je skup odgovarajućih čvorova neprazan. Tako p[@x]
odabira one p
elemente koji imaju atribut imenovan sa x
.
Složeniji primer: izraz a[/html/@lang='en'][@href='help.php'][1]/@target
odabira vrednosti target
atributa prvog a
elementa među svom decom kontekstnog čvora koji ima sopstveni href
atribut postavljen na help.php
, omogućujući da element najvišeg nivoa html
takođe ima i lang
atribut postavljen na en
. Referenca na atribut elementa najvišeg nivoa u prvom predikatu ne utiče niti na kontekst drugih predikata niti na sam korak lociranja.
Redosled predikata je bitan ukoliko predikati testiraju poziciju čvora. Svaki predikat izdvaja skup čvorova izabranih u koraku lociranja. Stoga će a[1][@href='help.php']
pronaći podudaranje jedino u prvom a
detetu kontekstnog čvora koje zadovoljava uslov @href='help.php'
, dok a[@href='help.php'][1]
pronolazi prvo a
dete koje zadovoljava ovaj uslov.
Funkcije i operatori uredi
XPath 1.0 definiše četiri tipa podataka: čvor-skupovi, stringovi, brojevi i logički tip.
Postojeći operatori su:
- "/", "//" , "[...]" operatori se koriste u opisivanju putanje, na već prikazan način.
- Operatorom uniranja, "|", obrazuje se unija dva čvor-skupa.
- Logički operatori "and" i "or", i funkcija "not()"
- Aritmetički operatori "+", "-", "*", "div", i "mod"
- Operatori poređenja "=", "!=", "<", ">", "<=", ">="
Biblioteka funkcija obuhvata:
- Funkcije za rad sa stringovima: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
- Funkcije za rad sa brojevima: sum(), round(), floor(), ceiling()
- Funkcije kojima se dobijaju svojstva čvorova: name(), local-name(), namespace-uri()
- Funkcije kojima se dobijaju informacije o kontekstu obrade: position(), last()
- Pretvaranje tipova functions: string(), number(), boolean()
Neke od najkorišćenijih funkcija su opisane ispod. Za potpun opis pogledati [6]
Funkcije za rad sa skupovima čvorova uredi
- position()
- vraća broj koji predstavlja poziciju ovog čvora u nizu čvorova koji se trenutno obrađuju (na primer, čvorovi odabrani sa instrukcijom xsl:for-each instruction u XSLT).
- count(node-set)
- vraća broj čvorova u skupu čvorova prosleđenom kao argument.
String functions uredi
- string(object?)
- konvertuje bilo koji od četiri XPath tipa podataka u string prema predefinisanim pravilima. Ako je vrednost argumenta čvor-skup, funkcija vraća string-vrednost prvog čvora u redosledu dokumenta, ignorišući dalje čvorove.
- concat(string, string, string*)
- spaja dva ili više stringova
- starts-with(s1, s2)
- vraća
true
akos1
započinje sas2
- contains(s1, s2)
- vraća
true
akos1
sadržis2
- substring(string, start, length?)
- primer:
substring("ABCDEF",2,3)
vraća"BCD"
. - substring-before(s1, s2)
- primer:
substring-before("1999/04/01","/")
vraća1999
- substring-after(s1, s2)
- primer:
substring-after("1999/04/01","/")
vraća04/01
- string-length(string?)
- vraća broj karaktera u stringu
- normalize-space(string?)
- beline sa krajeva bivaju uklonjene i svaki niz belina se zamenjuje jednim karakterom
Bulovske funkcije uredi
- not(boolean)
- negira bilo koji bulovski izraz.
- true()
- ima vrednost true.
- false()
- ima vrednost false.
Brojevne funkcije uredi
- sum(node-set)
- konvertuje sve string vrednosti čvorova nađenih sa XPath
argumentom u brojevima, posštujući pravila konverzije za dati sistem, i onda vraća
sumu ovih elemenata.
Primeri upotrebe uredi
Izrazi se mogu kreirati unutar predikata korišđenjem operatora: =, !=,
<=, <, >=
i : >
. Bulovski izrazi se
mogu kombinovati sa zagradama ()
i bulovskim operatorima
and
i or
kao i sa not()
funkcijom opisanom
iznad. Za numerička izračunavanja se koriste *, +, -,
div
i mod
. Stringovi se mogu
sastojati od bilo kojih Unicode karaktera.
//item[@price > 2*@discount]
bira stavke čiji atribut cena je veći od
dvostruke numeričke vrednosti popusta.
Čitav skup čvorova se može kombinovati ('unioned')
korišđenjem vertikalnog 'bar' karaktera |. Skup čvorova koji ispunjava jedan ili više
uslova se mogu naći korišđenjem unutar predikata sa 'or
'.
v[x or y] | w[z]
će vratiti jedan skup čvorova koji se sastoji od svih
v
elemenata koji imaju x
ili y
decu
elemente, kao i sve w
elemente koji imaju z
) decu
elemente.
Sintaksa i semantika(XPath 2.0) uredi
Primeri uredi
<?xml version="1.0" encoding="utf-8"?>
<wikimedia>
<projects>
<project name="Wikipedia" launch="2001-01-05">
<editions>
<edition language="English">en.wikipedia.org</edition>
<edition language="German">de.wikipedia.org</edition>
<edition language="French">fr.wikipedia.org</edition>
<edition language="Polish">pl.wikipedia.org</edition>
<edition language="Spanish">es.wikipedia.org</edition>
</editions>
</project>
<project name="Wiktionary" launch="2002-12-12">
<editions>
<edition language="English">en.wiktionary.org</edition>
<edition language="French">fr.wiktionary.org</edition>
<edition language="Vietnamese">vi.wiktionary.org</edition>
<edition language="Turkish">tr.wiktionary.org</edition>
<edition language="Spanish">es.wiktionary.org</edition>
</editions>
</project>
</projects>
</wikimedia>
XPath izraz
- /wikimedia/projects/project/@name
bira name atribute za sve projekte, i
- /wikimedia//editions
bira sve edicije za sve projekte, i
- /wikimedia/projects/project/editions/edition[@language="English"]/text()
selektuje adrese svih Engleskih Wikimedia projekata(tekst svih edition elemenata gde je language atribut jednak English). I naredni
- /wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()
bira adrese svih Wikipedia (tekst svih edition elemenata koji postoje pod project elementom sa name atributom Wikipedia)
Implementacija uredi
- Alatke komandne linije
- XMLStarlet
- xmllint (libxml2)
- RaptorXML Server tehnologija od Altova podržava XPath 1.0, 2.0, i 3.0
- Jedinica XPath je uključena u standardnu biblioteku.
- Implementacije za pogon baza podataka
- Saxon XSLT podržava XPath 1.0, XPath 2.0 i XPAth 3.0 (kao i sa XSLT 2.0, XQuery 3.0, i XPath 3.0)
- BaseX (takoće podržava XPath 2.0 i XQuery)
- VTD-XML
- QuiXPath[9], implementacija za strimovanje otvorenog koda od strane Innovimax-a
- MySQL podrćžava podskup XPath od verzije 5.1.5 nadalje[13]
- PostgreSQL podržava XPath i XSLT od verzoke 8.4 nadalje[14]
- tdom paket[15] pruža „potpunu, kompatibilnu i brzu XPath implementaciju u C-u“
Korišćenje u šema jezicima uredi
XPath se dosta koristi za izražavanje ograničenja u šema jezicima za XML.
- Šematski jezik Schematron, koji je sada već MOS (ISO) standard, je bio pionir tog pristupa.
- XPath podskup za strimovanje se koristi u W3C XML Schema 1.0 za izražavanje jednistvenosti i ključnih ograničenja. U XSD 1.1, mogućnosti XPath-a su proširene da podržavaju uslovno dodeljivanje tipova zasnovanog na vrednostima atributa, da omoguće da se armitrarne buleanske vrednosti izračunavaju u zavisnosti od sadržaja elemenata.
- XForms koristi XPath da bi vezao tipove za vrednosti.
- Taj pristup je našao primenu i van XML aplikacija, kao što je jezik ograničenja za Javu nazvan PMD: Java se pretvara u stablo parsiranja nalik na DOM, a ѕatim se XPath pravila definišu nad tim stablom
Vidi još uredi
Reference uredi
- ^ a b „XML and Semantic Web W3C Standards Timeline” (PDF). 4. 2. 2012. Arhivirano iz originala (PDF) 24. 04. 2013. g. Pristupljeno 03. 06. 2015.
- ^ Bergeron, Randy (31. 10. 2000). „XPath—Retrieving Nodes from an XML Document”. SQL Server Magazine. Arhivirano iz originala 26. 07. 2010. g. Pristupljeno 03. 06. 2015.
- ^ Geneves, Pierre (2012). „Course: The XPath Language” (PDF).
- ^ XPath 2.0 podržava atomičke tipove, definisane kao ugrađene tipove u XML Schema, i može da uveze korisnički definisane tipove iz sheme.
- ^ XPath 3.0 W3C preporuka
- ^ „W3C Dokumentaciju”. Arhivirano iz originala 09. 12. 2012. g. Pristupljeno 03. 06. 2015.
- ^ „Pathan”. Arhivirano iz originala 08. 04. 2015. g. Pristupljeno 03. 06. 2015.
- ^ „XQilla”. Arhivirano iz originala 18. 05. 2015. g. Pristupljeno 03. 06. 2015.
- ^ QuiXPath
- ^ jQuery XPath nastavak
- ^ XPath 2.0 implementacija u Javaskcript
- ^ The XML C parser and toolkit of Gnome
- ^ MySQL :: MySQL 5.1 Reference Manual :: 12.11 XML Functions
- ^ Online docs atpostgresql.org
- ^ „tdom package”. Arhivirano iz originala 03. 06. 2015. g. Pristupljeno 03. 06. 2015.
Spoljašnje veze uredi
- XPath 1.0 specification
- XPath 2.0 specification
- XPath 3.0 specification
- XPath 3.1 specification
- What's New in XPath 2.0
- XPath Reference (MSDN)
- XPath Expression Syntax (Saxon)
- XPath 2.0 Expression Syntax (Saxon), [1]
- XPath - MDC Docs Arhivirano na sajtu Wayback Machine (5. maj 2012) by Mozilla Developer Network
- XPath introduction/tutorial
- XSLT and XPath function reference
- What's new 3.0 Xpath XSLT XSD 1.1