XPath(XML Path Language)
Laurea Magistrale Laurea Magistrale in Informaticain Informatica
XPath - XML Path Language 2
Obiettivi
XPath - XML Path Language 3
XPath
XPath è un linguaggio che permette di localizzare parti di un documento XML
XPath non è un linguaggio strutturato ma un linguaggio basato su stringhe ed espressioni che sono utilizzate da altre tecnologie XML
XPath opera sulla struttura logica del documento, non su quella sintattica
XPath dispone anche di primitive per eseguire semplici operazioni su stringhe, numeri e valori booleani
XPath - XML Path Language 4
Il documento secondo XPath
Dal punto di vista di XPath, il documento XML è un albero Ogni elemento, commento, attributo, namespace, PI o
stringa di testo (non-markup) è un nodo dell’albero Le relazioni tra i nodi sono semplici:
Il documento ha un solo nodo radice che contiene tutti gli altri
Un elemento annidato è un nodo figlio (child node) dell’elemento che lo contiene
Commenti, PI e testo sono figli dell’elemento che li contiene I nodi attributo e dei namespace non sono considerati child
dei loro parent Non sono contenuti all’interno dei parent ma sono solo utilizzati
per fornire informazioni descrittive
XPath - XML Path Language 5
Un semplice documento XML e la sua struttura ad albero con XPATH
XPath - XML Path Language 6
Un documento xml con due nodi di namespace ed un nodo PI
XPath - XML Path Language 7
Location Path e Location Step
Il Location Path ( path di posizione) specifica come spostarsi tra i nodi dell’albero
Un Location Path è composto di una sequenza di passi di locazione (Location Step) separati da ‘/’, e letti da sinistra a destra. Ogni termine individua più precisamente un frammento della risorsa individuata in precedenza.
Un location step ha tre parti: Un asse Un test di nodo Zero o più predicati
axis::test[pred1][pred2]…[pred N]
XPath - XML Path Language 8
Nodo di contesto
Le ricerche iniziano dal nodo di contesto
Se abbiamo una istruzione xpath che restituisce il primo child del nodo di contesto Nodo di contesto
Head = nodo dell’elemento Title
Nodo di contesto HTML = nodo dell’elemento Head
XPath - XML Path Language 9
L’asse è un insieme di nodi
Indica quali nodi riferiti al contesto debbono essere inseriti nella ricerca
Determina la sequenza di ricerca dei nodi ( diretta o inversa)
Muovendosi sull’albero del documento, XPath permette di scegliere non solo tra i figli del nodo corrente, ma anche tra una serie di altri insiemi di nodi che sono in relazione con esso
Gli assi identificano la direzione rispetto alla struttura del documento in cui andare a cercare l’oggetto da restituire rispetto al nodo contesto (NC)
Gli Assi
XPath - XML Path Language 10
Gli Assi XPATH (I)
self Contiene il nodo corrente
child Contiene gli elementi direttamente annidati nel
contesto parent
Contiene il padre dell’elemento corrente attribute
Contiene gli attributi del nodo corrente ancestor
Contiene il padre del nodo, il padre del padre, ecc… ancestor-or-self
Come ancestor, ma contiene anche il nodo corrente
XPath - XML Path Language 11
Gli Assi Xpath (II)
descendant Contiene tutti gli elementi annidati nel nodo corrente
(con livello di annidamento arbitrario) descendant-or-self
Come descendant, ma contiene anche il nodo corrente
following Contiene tutti i nodi che si trovano dopo quello
corrente all’interno del documento, esclusi i discendenti, gli attributi del nodo e i namespaces
following-sibling Contiene tutti i nodi che hanno lo stesso livello di
nidificazione nell’elemento padre di quello corrente e sono posti dopo di esso (“fratelli”)
XPath - XML Path Language 12
Gli Assi Xpath (III)
preceding Contiene tutti i nodi che si trovano prima quello
corrente all’interno del documento, esclusi i suoi antenati (ancestors), gli attributi del nodo e i namespaces
preceding-sibling Contiene tutti i nodi che hanno lo stesso livello di
nidificazione nell’elemento padre di quello corrente e sono posti prima di esso
namespace Contiene i nodi namespace dichiarati per l’elemento
corrente.
XPath - XML Path Language 13
Le gerarchie secondo XPath
ancestor: [c,a]ancestor-or-self: [d,c,a] attribute: [x]child: [f]descendant: [f,g]descendant-or-self: [d,f,g]following: [i,h]following-sibling: [i]namespace: [y]parent: [c]preceding: [b,e]preceding-sibling: [e]self: [d]
Nod
o Co
rren
te
Nod
o Co
rren
te<a>
<c>
<b/>
</c>
</a>
<d xmlns:y=“…” x=“…”>
<e/>
</d>
<g/>
<f>
</f>
<i/>
<h/>
XPath - XML Path Language 14
Test di nodo (node test)
Per individuare un particolare nodo su un asse, si usano il suo tipo e/o il suo nome tramite i cosiddetti node test.
un asse ha un tipo di nodo principale che corrisponde al tipo di nodo che l’asse può selezionare
Il test può essere:
Un nome: vero se il nodo (elemento o attributo) ha quel nome
text(), processing-instruction(), comment(): vero se il nodo è di tipo testo, processing instruction o commento.
node(): vero sempre
* : vero per tutti i nodi del tipo definito dall’asse
XPath - XML Path Language 15
Path di posizione con assi e test dei nodi
Location step child::*
Seleziona tutti i nodi degli elementi child del nodo di contesto
Location step child::text()
Seleziona tutti i nodi di testo child del nodo di contesto
Location path child::*/child::text()
Seleziona tutti i nodi di testo dei nipoti del nodo di contesto
Esempio con html come nodo di contesto
XPath - XML Path Language 16
child::*/child::text()
Nodi degli elementi Head e Body
Risultato nullo perché né Head né Body hanno figli text
XPath - XML Path Language 17
Sintassi abbreviata
In alcuni casi esistono delle forme abbreviate usabili invece della sintassi completa:
Child::x si può abbreviare con x Attribute::a si può abbreviare con @a Descendant si può abbreviare con ‘//’, self con ‘.’, parent con ‘..’
Esempi: /doc/chapter[5]/section[2]: la seconda sezione del
quinto capitolo del documento ./chapter//para: tutti i para discendenti a qualunque
livello di ogni nodo chapter figlio del NC //para: tutti i para discendenti a qualunque livello della
radice del documento
XPath - XML Path Language 18
Esempio
Supponiamo di voler conoscere quali libri sono stati tradotti in giapponese
/books/book/translation[.=‘Japanese’]/../title
Per selezionare l’attributo edition
/books/book/translation[.=‘Japanese’]/@edition
XPath - XML Path Language 19
I Predicati
I predicati corrispondono a filtri sull’insieme dei nodi selezionandone una parte secondo particolari criteri Il risultato di un filtro è l’insieme dei nodi filtrati
In ciascuno step si possono inserire un numero arbitrario di filtri, che vengono richiamati nell’ordine in cui si presentano I filtri vanno posti nello step sempre dopo il node test
All’interno del filtro si possono usare espressioni che abbiano valore booleano
L’espressione del filtro viene valutata usando ciascun nodo del set come contesto, e se vale true il nodo viene aggiunto all’insieme dei risultati
XPath - XML Path Language 20
Operandi nei Filtri
All’interno dei filtri si possono usare espressioni XPath operandi: Espressioni XPath (compresi altri filtri nidificati!), che
vengono valutate usando come contesto ciascun nodo dell’insieme di input
Il “valore” di una espressione XPath, se usata con operatori di confronto, è il testo in essa contenuto (valore dell’attributo o testo all’interno dell’elemento). Se l’espressione è un insieme, XPath restituisce true se c’è almeno un suo elemento che soddisfi il test.
Costanti numeriche o stringhe tra virgolette
XPath - XML Path Language 21
I Filtri - Esempi
/collection/album[title = “Supernatural”]/@IDgli ID di ogni album nella collection che abbia
un (figlio) title contenente il testo “Supernatural”.
/collection/album[@ID = “123”]tutti gli album nella collection con ID uguale a “123”.
/collection/song[
@album =//album[title =“Supernatural”]/@ID
]/titlei titoli di tutte le song nella collection che hanno un attributo album uguale
all’ID di uno degli elementi album (presenti in qualunque punto tra i discendenti del contesto corrente) che hanno come title “Supernatural”.
XPath - XML Path Language 22
<collection>
<song>
</collection>
<title/>
</song>
<song>
<title/>
</song>
<album>
<title/>
</album>
<album>
<title/>
</album>
<song>
<title/>
</song>
<song>
<title/>
</song>
collection/songcollection/song
<album>
<title/>
</album>
<album>
<title/>
</album>
//album//album
<album>
<title/>
</album>
//album[title=“S”]//album[title=“S”]
<song>
<title/>
</song>
collection/song[…]collection/song[…]
<title/>
collection/collection/song[…]/song[…]/
titletitle
/collection/song[@album =//album[title = “S”]/@ID]/title
XPath - XML Path Language 23
I Filtri - Esempi
//album/title[ . = “Supernatural”]il title di tutti gli album intitolati “Supernatural” (!)
/collection/song[comment]tutte le song nella collection che hanno un comment
/collection/song[comment[1] = “Hit”]tutte le song nella collection il cui primo comment
contiene il testo “Hit” (non sottostringa!)
//album[3]il terzo elemento album presente in tutto il file XML
XPath - XML Path Language 24
I Filtri - Esempi
//song[1][@album = “santana1”]la prima song nel documento, se ha un attributo album con valore “santana1”
//cd[owner = “myself”]/song[@album = “santana1”]/title
i title di tutte le song aventi un attributo album con valore “santana1” che si trovano in un cd avente un elemento
figlio owner con valore “myself”.
//*[self::song or self::album]tutti i nodi song o album nel documento corrente, a
qualsiasi livello di nidificazione.
XPath - XML Path Language 25
Operatori nei Filtri
All’interno dei filtri si possono usare operatori: Confronto: ‘=’ (uguale), ‘!=’ (diverso), ‘>’ (maggiore),
‘>=’ (maggiore o uguale), ‘<’ (minore), ‘<=’ (minore o uguale).
Logici (tra espressioni filtro valide): and, or, not(…) Insiemistici: (da usare tra insiemi di nodi, ma
all’esterno dei filtri!): ‘|’ (unione). Raggruppamento (per dare precedenza a certe
espressioni, si possono usare anche all’esterno dei filtri!): ‘(…)’
Matematici: ‘+’, ‘-’, ‘*’, ‘/’, mod
XPath - XML Path Language 26
I Filtri - Esempi
//album[@tracks >= 5]
tutti gli album con attributo tracks
avente valore maggiore di cinque
//song[title and artist]
tutte le song aventi (almeno)
un figlio title e un figlio artist
//song[@album != “santana1” and not(comment)]tutte le song con un attributo album con valore
diverso da “santana1” e senza figli comment
//cd/song[1]
la prima song di tutti i cd
(//cd/song)[1]
la prima di tutte le song in tutti i cd
XPath - XML Path Language 27
Funzioni nei Filtri
All’interno dei filtri si possono usare vari tipi di funzioni: funzioni su insiemi di nodi funzioni su stringhe funzioni numeriche funzioni booleane funzioni XSLT - Specifiche (non presenti nella
specifica XPath)
XPath - XML Path Language 28
Funzioni su Nodi
Principali funzioni sugli insiemi di nodi: count(ns): dimensione dell’insieme di nodi ns. last(): indice dell’ultimo elemento nell’insieme di nodi
corrente. position(): posizione del nodo corrente all’interno del
suo genitore. document(...): permette di accedere a documenti XML
esterni. id(“…”): restituisce il nodo con l’attributi di tipo ID
avente il valore dato.
XPath - XML Path Language 29
Funzioni sulle Stringhe
Principali funzioni sulle stringhe: string(o): converte l’oggetto o in una stringa. concat(s1,s2,...): concatena più stringhe. substring(s,x,y): sottostringa di s che inizia al
carattere x ed è lunga y (opzionale) substring-after(s,t): la sottostringa di s che inizia dopo
i caratteri t substring-before(s,t): la sottostringa di s che arriva
fino ai caratteri t contains(s,t): vero se s contiene t. starts-with(s,t): vero se s inizia con t. string-length(s): la lunghezza della stringa s.
XPath - XML Path Language 30
Funzioni Booleane
Principali funzioni sui valori booleani: boolean(o): converte l’oggetto o in un valore
booleano. true(): vale sempre true. false(): vale sempre false. not(e): vale l’opposto di e.
XPath - XML Path Language 31
Funzioni Numeriche
Principali funzioni sui valori numerici: number(o): converte l’oggetto o in un valore
numerico. ceiling(x): restituisce l’intero più piccolo che non sia
minore di x. floor(x): restituisce l’intero più grande che non sia
maggiore di x. round(x): arrotonda x a un intero. sum(ns): converte in numeri (usando number()) tutti i
nodi nell’insieme ns, e ne restituisce la somma.
XPath - XML Path Language 32
I Filtri - Esempi
//song[position() = last()]l’ultima song nel documento.
//cd[sum(song/length) > 60]/titlei titoli di tutti i cd in cui la durata
totale delle song è maggiore di 60.
//cd[count(song) < 12]i cd con meno di 12 song.
//album[substring-after(
substring-after(@date),’/’),’/’) = ‘2000’]gli album in cui l’attributo date è del tipo “…/…/2000”
//album[@ID = current()/@album]gli album il cui attributo ID è uguale all’attributo album del
contesto esterno corrente.
XPath - XML Path Language 33
Un ulteriore esempio di XPath
<prenotazioni> <biglietto nome="Luca Verdi"> <voloAndata data=“1-8-2005”> <tappa t="Bologna"/><tappa t="Frankfurt"/><tappa t="NewYork"/> </voloAndata> <voloRitorno data=“8-8-2005”> <tappa t="NewYork"/><tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>990</prezzo> </biglietto> <biglietto nome="Luigi Bianchi"> <destinazione>Roma</destinazione> <voloAndata data=“6-8-2005”> <tappa t="Bologna"/><tappa t="Roma"/> </voloAndata> <voloRitorno data=“7-8-2005”> <tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>240</prezzo> </biglietto>...
Scrivere un XPath che identifichi:1.Tutti i biglietti di Luca Verdi2.Tutti i biglietti che costano più di
1000 euro3.Tutte le tappe di tutti i voli4.Tutti i biglietti del 6 agosto5.Tutti i biglietti che passano per
Roma6.Le date di tutti i biglietti che
arrivano a Napoli
XPath - XML Path Language 34
<prenotazioni> <biglietto nome="Luca Verdi"> <voloAndata data=“1-8-2005”> <tappa t="Bologna"/><tappa t="Frankfurt"/><tappa t="NewYork"/> </voloAndata> <voloRitorno data=“8-8-2005”> <tappa t="NewYork"/><tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>990</prezzo> </biglietto> <biglietto nome="Luigi Bianchi"> <destinazione>Roma</destinazione> <voloAndata data=“6-8-2005”> <tappa t="Bologna"/><tappa t="Roma"/> </voloAndata> <voloRitorno data=“7-8-2005”> <tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>240</prezzo> </biglietto>...
Tutti i biglietti di Luca Verdi
//prenotazioni/biglietto[@nome=‘Luca Verdi’]
Un ulteriore esempio di XPath
XPath - XML Path Language 35
<prenotazioni> <biglietto nome="Luca Verdi"> <voloAndata data=“1-8-2005”> <tappa t="Bologna"/><tappa t="Frankfurt"/><tappa t="NewYork"/> </voloAndata> <voloRitorno data=“8-8-2005”> <tappa t="NewYork"/><tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>990</prezzo> </biglietto> <biglietto nome="Luigi Bianchi"> <destinazione>Roma</destinazione> <voloAndata data=“6-8-2005”> <tappa t="Bologna"/><tappa t="Roma"/> </voloAndata> <voloRitorno data=“7-8-2005”> <tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>240</prezzo> </biglietto>...
Tutti i biglietti che costano più di 1000 euro
//prenotazioni/biglietto[prezzo > 1000]
Un ulteriore esempio di XPath
XPath - XML Path Language 36
<prenotazioni> <biglietto nome="Luca Verdi"> <voloAndata data=“1-8-2005”> <tappa t="Bologna"/><tappa t="Frankfurt"/><tappa t="NewYork"/> </voloAndata> <voloRitorno data=“8-8-2005”> <tappa t="NewYork"/><tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>990</prezzo> </biglietto> <biglietto nome="Luigi Bianchi"> <destinazione>Roma</destinazione> <voloAndata data=“6-8-2005”> <tappa t="Bologna"/><tappa t="Roma"/> </voloAndata> <voloRitorno data=“7-8-2005”> <tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>240</prezzo> </biglietto>...
Tutte le tappe di tutti i voli:
//tappa
Un ulteriore esempio di XPath
XPath - XML Path Language 37
<prenotazioni> <biglietto nome="Luca Verdi"> <voloAndata data=“1-8-2005”> <tappa t="Bologna"/><tappa t="Frankfurt"/><tappa t="NewYork"/> </voloAndata> <voloRitorno data=“8-8-2005”> <tappa t="NewYork"/><tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>990</prezzo> </biglietto> <biglietto nome="Luigi Bianchi"> <destinazione>Roma</destinazione> <voloAndata data=“6-8-2005”> <tappa t="Bologna"/><tappa t="Roma"/> </voloAndata> <voloRitorno data=“7-8-2005”> <tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>240</prezzo> </biglietto>...
Tutti i biglietti del 6 agosto
//biglietto[*/@data="6-8-2005"]
Un ulteriore esempio di XPath
XPath - XML Path Language 38
<prenotazioni> <biglietto nome="Luca Verdi"> <voloAndata data=“1-8-2005”> <tappa t="Bologna"/><tappa t="Frankfurt"/><tappa t="NewYork"/> </voloAndata> <voloRitorno data=“8-8-2005”> <tappa t="NewYork"/><tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>990</prezzo> </biglietto> <biglietto nome="Luigi Bianchi"> <destinazione>Roma</destinazione> <voloAndata data=“6-8-2005”> <tappa t="Bologna"/><tappa t="Roma"/> </voloAndata> <voloRitorno data=“7-8-2005”> <tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>240</prezzo> </biglietto>...
Tutti i biglietti che passano per Roma
//biglietto[.//tappa/@t="Roma"]
Un ulteriore esempio di XPath
XPath - XML Path Language 39
<prenotazioni> <biglietto nome="Luca Verdi"> <voloAndata data=“1-8-2005”> <tappa t="Bologna"/><tappa t="Frankfurt"/><tappa t="NewYork"/> </voloAndata> <voloRitorno data=“8-8-2005”> <tappa t="NewYork"/><tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>990</prezzo> </biglietto> <biglietto nome="Luigi Bianchi"> <destinazione>Roma</destinazione> <voloAndata data=“6-8-2005”> <tappa t="Bologna"/><tappa t="Roma"/> </voloAndata> <voloRitorno data=“7-8-2005”> <tappa t="Roma"/><tappa t="Bologna"/> </voloRitorno> <prezzo>240</prezzo> </biglietto>...
Tutti i biglietti che arrivano a Napoli
//biglietto[.//tappa[last()]="Napoli"]
Un ulteriore esempio di XPath
XPath - XML Path Language 40
Uso delle funzioni di stringa
XPath - XML Path Language 41
XPath - XML Path Language 42
Riferimenti
Deitel et al, XML Corso di programmazione, Apogeo
Chris Bates, XML in theory and Practice, Wiley
XML Path Language (XPath) Version 1.0W3C Recommendation 16 November 1999http://www.w3.org/TR/xpath
W3Schools Online Web Tutorialshttp://www.w3schools.com/xpath/default.asp