420 likes | 573 Views
XPath ( X ML Path Language). Laurea Magistrale in Informatica. Obiettivi. XPath. XPath è un linguaggio che permette di localizzare parti di un documento XML
E N D
XPath(XML Path Language) Laurea Magistrale in Informatica
Obiettivi XPath - XML Path Language
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
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
Un semplice documento XML e la sua struttura ad albero con XPATH XPath - XML Path Language
Un documento xml con due nodi di namespace ed un nodo PI XPath - XML Path Language
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
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
Gli Assi • 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) XPath - XML Path Language
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
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
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
<a> <b/> <c> <e/> <d xmlns:y=“…” x=“…”> <f> <g/> </f> </d> <i/> </c> <h/> </a> 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] Nodo Corrente XPath - XML Path Language
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
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
child::*/child::text() • Nodi degli elementi Head e Body • Risultato nullo perché né Head né Body hanno figli text XPath - XML Path Language
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
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
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
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
I Filtri - Esempi /collection/album[title = “Supernatural”]/@ID gli 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 ]/title i 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
<collection> collection/song <song> <song> collection/song[…] collection/song[…]/title <title/> <title/> <song> </song> </song> <title/> <title/> <song> <song> </song> <title/> <title/> </song> </song> //album <album> <album> <title/> //album[title=“S”] <title/> </album> <album> </album> <album> <title/> <album> <title/> </album> <title/> </album> </album> </collection> /collection/song[@album =//album[title = “S”]/@ID]/title XPath - XML Path Language
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
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
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
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
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
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
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
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
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
I Filtri - Esempi //song[position() = last()] l’ultima song nel documento. //cd[sum(song/length) > 60]/title i 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
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: • Tutti i biglietti di Luca Verdi • Tutti i biglietti che costano più di 1000 euro • Tutte le tappe di tutti i voli • Tutti i biglietti del 6 agosto • Tutti i biglietti che passano per Roma • Le date di tutti i biglietti che arrivano a Napoli XPath - XML Path Language
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> ... Tutti i biglietti di Luca Verdi //prenotazioni/biglietto[@nome=‘Luca Verdi’] XPath - XML Path Language
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> ... Tutti i biglietti che costano più di 1000 euro //prenotazioni/biglietto[prezzo > 1000] XPath - XML Path Language
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> ... Tutte le tappe di tutti i voli: //tappa XPath - XML Path Language
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> ... Tutti i biglietti del 6 agosto //biglietto[*/@data="6-8-2005"] XPath - XML Path Language
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> ... Tutti i biglietti che passano per Roma //biglietto[.//tappa/@t="Roma"] XPath - XML Path Language
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> ... Tutti i biglietti che arrivano a Napoli //biglietto[.//tappa[last()]="Napoli"] XPath - XML Path Language
Uso delle funzioni di stringa XPath - XML Path Language
Riferimenti • Deitel et al, XML Corso di programmazione, Apogeo • Chris Bates, XML in theory and Practice, Wiley • XML Path Language (XPath) Version 1.0 W3C Recommendation 16 November 1999 http://www.w3.org/TR/xpath • W3Schools Online Web Tutorials http://www.w3schools.com/xpath/default.asp XPath - XML Path Language