XPath(XML Path Language) Laurea Magistrale
in Informatica
Reti 2 (2005/06)dott. Francesco De Angelis
francesco.deangelis@unicam.it
XPath(XML Path Language) Laurea Magistrale
in Informatica
Reti 2 (2005/06)
dott. Francesco De Angelis
francesco.deangelis@unicam.it
Agenda
Location Path e Location Step
Assi
Test di nodo
Predicati (o filtri)
Operatori e funzioni nei filtri
Precisazioni
Molti esempi…
XPath
XPath è un linguaggio che permette di indirizzare parti di un documento XML
XPath è una parte fondamentale di XSLT e di altre specifiche come XLink
XPath opera sulla struttura logica del documento, non su quella sintattica, usando una sintassi non XML accettabile all’interno di URI e attributi
XPath dispone anche di primitive per eseguire semplici operazioni su stringhe, numeri e valori booleani
Il documento secondo XPath
Dal punto di vista di XPath, il documento XML è un albero
Ogni elemento, commento, attributo, PI o stringa di testo (non-markup) è un nodo dell’albero
Le relazioni tra i nodi sono semplici:
Un elemento annidato è un nodo figlio (child node) dell’elemento che lo contiene
Commenti, PI e testo sono figli dell’elemento che li contiene (o del documento)
I nodi attributo e dei namespace non sono considerati child dei loro parent
Location Path e Location Step
Il Location Path 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]
Gli Assi
L’asse è un insieme di nodi
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)
L’asse child degli elementi figli diretti è l’asse predefinito
Gli Assi
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
Gli Assi
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”)
Gli Assi
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.
Un esempio di alcuni assi
/ R S P I B I S S P P P B P P P P P P S P I P Asse self:: Asse parent:: Asse preceding-sibling:: Asse following-sibling:: Asse child:: Asse ancestor:: Asse preceding:: Asse following:: Asse descendant::
I tipi di nodo sono:
radice
elemento
attributo
testo
namespace
commento
processing-instruction Ogni asse ha un tipo predefinito
se l’asse contiene elementi, il tipo predefinito è “elemento”
se l’asse non contiene elementi ma attributi, il tipo predefinito è “attributo”
se l’asse non contiene elementi ma namespace, il tipo predefinito è “namespace”
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
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.
Nel caso si lavori su un insieme di nodi, tutte le operazioni vengono applicate iterativamente a ciascun nodo
Il risultato è un insieme di nodi, ciascuno dei quali può essere ulteriormente attraversato
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
I Nomi
Alcuni nodi possiedono anche un loro nome:
I nodi elemento e attributo hanno il nome dell’elemento e dell’attributo stessi
Per indicare il nodo con un particolare nome, si usa semplicemente il nome stesso come test
Lo speciale test ‘*’ fa match con tutti i nodi accessibili sull’asse, con qualunque nome
I test restituiscono l’insieme dei nodi con quel particolare nome presenti sull’asse
I Predicati
I predicati in XPath corrispondono a dei 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
I Predicati
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
Esistono due eccezioni:
Se l’espressione restituisce un numero, viene selezionato il nodo in quella posizione nell’insieme (gli insiemi di nodi sono ordinati)
Se l’espressione restituisce un insieme di nodi, allora vale true se l’insieme non è vuoto.
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
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”.
Comments