XPath
Corso di basi di dati II
Prof. Francesco Cutugno
Dott. Sara Romano
XML
XML eXtensible Markup Language è un
metalinguaggio;
sviluppato dal consorzio World Wide Web
(W3C);
Utilizzato per rappresentare dati
semistrutturati (dati che presentano una
forma di struttura che non è così regolare
e completa come nel caso dei dati
strutturati)
Struttura di XML
caratterizzato da una struttura gerarchica;
ciascun
elemento (tag) rappresenta un componente
logico del documento e può contenere altri elementi
(sottoelementi) o testo;
ogni elemento può avere associate delle informazioni
aggiuntive attraverso la definizione di attributi;
L'organizzazione degli elementi segue un ordine
gerarchico che prevede un elemento principale
che è chiamato root element.
Document tree
Il root element contiene l'insieme degli altri
elementi del documento.
Un documento XML è rappresentato
attraverso un albero, generalmente noto
come document tree.
XML Tree 1/2
<bib>
<book price=“55”>
<publisher>Addison-Wesley</publisher>
<author>Serge Abiteboul</author>
<author><first-name>Rick</first-name>
<last-name>Hull</last-name>
</author>
<author>Victor Vianu</author>
<title>Foundations of Databases</title>
<year>1995</year>
</book>
<book> <publisher>Freeman</publisher>
<author>Jeffrey D. Ullman</author>
<title>Principles of Database and Knowledge Base
Systems</title>
<year>1998</year>
</book>
</bib>
XML Tree 2/2
The root
bib
book
price=55
publisher
Addison-Wesley
The root element
book
author
. . . .
Serge Abiteboul
Un po’ di terminologia
<library>
<book>
<chapter>
</chapter>
<chapter>
<section>
<paragraph/>
<paragraph/>
</section>
</chapter>
</book>
</library>
library è padre di book; book è il
padre dei due nodi chapter
I due nodi chapter sono figli di book,
e il nodo section è figlio del secondo
nodo chapter
I due nodi chapter (figli del nodo
book) sono fratelli (sibling)
library, book, e il secondo chapter
sono antenati (ancestors) del nodo
section
I due nodi chapter, il nodo section, e
il nodo paragraph sono discendenti
(descendents) del nodo book
Tipi
di
nodi
Document: è il primo nodo e rappresenta l’intero
documento XML. Questo nodo non corrisponde a nulla
di visibile all’interno del documento ma rappresenta il
documento stesso;
Element: è un nodo che rappresenta un generico
elemento del documento XML (etichette);
Attribute: è un particolare nodo che viene associato ad
un nodo Element ma non viene considerato come suo
nodo figlio; rappresenta l’attributo di un elemento del
documento
Text: contenuto testuale di un nodo (nodo foglia);
Processing instruction: un nodo contenente un’istruzione
da eseguire;
Comment: un nodo utilizzato per commentare un
documento XML;
Namespace: un nodo associato ad un nodo Element che
ne identifica il namespace
Cos’è XPath?
XPath è un linguaggio utilizzato per
selezionare parti di un documento XML;
È uno standard W3C dal 1999;
XPath contiene una libreria di oltre 100
funzioni standard (manipolazione stringhe,
valori numerici ecc..)
XPath
XSLT
XPath
XQuery
Non è un XML (la sintassi non è XML) ma viene
utilizzato in XSLT e XQuery (indispensabile);
Il modo in cui XPath definisce percorsi lungo l’albero
XML per estrarre elementi è simile al modo in cui un
sistema operativo definisce percorsi ai file.
Paths
Operating system:
XPath:
/ = la root directory
/library = il root element (se ha nome
library )
/users/sara/prova = il
file (o directory) chiamato
prova in sara in users
prova = il file (o directory)
chiamato prova nella directory
corrente
. = la directory corrente
/library/book/chapter/section =
tutti gli elemente section in un
chapter in ogni book nella library
.. = la directory padre
.. = il padre dell’elemento corrente
/users/sara/* = tutti i files in
/users/dave
/library/book/chapter/* = tutti gli
elementi in /library/book/chapter
section = ogni elemento section
che è figlio dell’elemento corrente
. = l’ elemento corrente
Node List
Una espressione XPath produce come risultato
una node list.
Definizione (Node List): Dato un albero XML
T=(N, E), una Node List NL={n | n N} è un
insieme di nodi di nodi n appartenenti all’albero
XML t.
N.B. Per il modello di rappresentazione XML
anche gli attributi e il testo sono nodi
Location Path
Una espressione XPath è detta location path;
Con i location paths è possibile definire qualsiasi
percorso;
Un LP identifica un node set (insieme di nodi);
Un LP è costituito da una successione di
Location Steps separati dal simbolo ‘/’ e letti da
sinistra verso destra;
Un LP ha la seguente forma:
locationStep1/locationStep2/.../locationStepn
Location Step
Ogni location step ha la seguente forma:
axis::nodetest[filter1]…[filtern]
Un Axis, individua la direzione di specifica del
location step nell’albero e rispetto al nodo
corrente;
Un NodeTest individua il tipo e il nome completo
del nodo identificato dal location step;
Un Filter è un predicato che raffinano
ulteriormente l’insieme di nodi selezionati dal
location step.
Axis
Gli assi possibili sono 13:
child, descendant: figlio diretto e a qualunque livello del context
node.
parent, ancestor: il genitore immediato a qualunque livello del
context node.
self: il context node.
attribute: gli attributi del context node.
preceding-sibling, following-sibling: i nodi allo stesso livello
ma precedenti o seguenti il context node.
preceding, following: i nodi a qualunque livello, ma fuori al
context node, che precedono o seguono il context node.
descendan-tor-self, ancestor-or-self: come descendant e
ancestor, ma considerando anche il context node.
namespace: il nodo namespace;
Node test
Il NodeTest identifica il tipo di oggetto da
restituire. Se un’asse identifica un nodo o un
attributo (attribute), questo può essere verificato
attraverso un test sul nome;
Il test può essere:
NameTest:
condizione vera se il nodo (che sia
elemento o attributo) possiede quel nome.
NodeType: tipologie di nodi che diventano condizione
di filtro. Le tipologie di nodi sono:
text() per identificare nodi di tipo testo, c
comment() per identificare nodi di tipo commento,
node() identifica un generico nodo
Filter 1/2
Un Filter è un predicato che filtra l’insieme dei
nodi rispetto alla direzione indicata dall’axis per
produrre un nuovo insieme di nodi.
Il filtro può essere attuato sulla posizione di un
nodo o valutando un’espressione booleana. In
questo secondo caso il risultato è quel
sottoinsieme di nodi, tra quelli individuati finora,
per cui l’espressione booleana è vera.
Il filter è sempre racchiuso tra parentesi quadre
[…]
Filter 2/2
Predicato: [a] con a espressione booleana.
EspressioneBooleana: a or b, a and b, not a, c, con a e
b espressioni booleane e c espressione relazionale.
EspressioneRelazionale: a=b, a!=b, a<b, a>b, a=<b,
a=>b, c, con c espressione aritmetica.
EspressioniAritmetiche: a+b, a-b, a*b, a div b, a mod
b, c, con c espressione di disgiunzione.
EspressioniDisgiunzione: a | b, c, con c espressione di
path.
Espressione di Path: LocationPath o Espressione
primaria.
EspressionePrimaria: numero, lettera o chiamata
funzione (XPath possiede un insieme di funzioni
predefinite).
Axis:
esempi
Partendo da un nodo, gli axis self, preceding, following,
ancestor, e descendant si comportano nel seguente modo:
<library>
<book>
<chapter/>
<chapter>
<section>
<paragraph/>
<paragraph/>
</section>
</chapter>
<chapter/>
</book>
<book/>
</library>
//chapter[2]/self::*
//chapter[2]/preceding::*
//chapter[2]/following::*
//chapter[2]/ancestor::*
//chapter[2]/descendant::*
Axis:
vista
ad
albero
Partendo da un nodo, gli axis self, preceding, following,
ancestor, e descendant si comportano nel seguente modo:
library
ancestor
following
book[2]
book[1]
preceding
chapter[1]
self
chapter[2]
chapter[3]
section[1]
descendant
paragraph[1]
paragraph[2]
Sintassi abbreviata
Nodename: seleziona tutti i nodi figli del
nodo nodename
/ - Seleziona a partire dalla radice
// - seleziona nodi nel documento a partire
dal nodo corrente indipndentemente dalla
loro posizione nell’albero
. - seleziona il nodo corrente
.. - seleziona il padre del nodo corrente
@ - per selezionare gli attributi dei nodi
Location steps e sintassi
abbreviata
child:: può essere omesso dal location step
perchè è l’axis di default
bib/book è equivalente a child::bib/child::book
attribute:: può essere sostituito da @
descendant-or-self:: può essere sostituito da //
self::node() può essere abbreviato con .
.//book è l’abbreviazione di
self::node()/descendant-or-self::node()/child::book
parent::node() può essere sostituito con ..
attribute::lang può essere sostituito da /@lang
Selezionare nodi
Per selezionare un nodo posso fare
riferimento al suo nodename
Per selezionare un qualunque nodo (o
attributo) indipendentemente dal nome
posso usare:
* seleziona nodi element di un livello;
@* seleziona un nodo attribute;
node() seleziona qualunque nodo
Operatori di XPath
Una espressione XPath restituisce un
node-set o una stringa o un booleano, o
un numero;
Le espressioni XPath possono utilizzare i
seguenti tipi di operatori:
Operatori
aritmentici;
Operatori di confronto;
Operatori booleani;
Operatori Aritmetici
+
*
div
mod
addizione
sottrazione
moltiplicazione
divisione (non si può usare /)
modulo
Operatori di confronto 1/2
=
“equals”
!=
“not equals”
Attenzione:
valore = node-set è vera se il node-set contiene
qualche nodo che ha valore uguale a valore
valore != node-set è vera se il node-set contiene
qualche nodo che non ha valore uguale a valore
quindi,
value = node-set e value != node-set may
possono essere entrambe vere nello stesso
momento!
Operatori di confronto 2/2
I seguenti operatori possono essere usati
solo per confronti su valori numerici:
<
“minore”
<= “minore o uguale”
>
“maggiore”
>= “maggiore o uguale”
Operatori logici
and
or
not()
(function)
price=9.80 or price=9.70 è vera se price è
9.80 falsa se price è 9.50
price>9.00 and price<9.90 è vera se price
è 9.80 falsa se price è 8.50
Funzioni di XPath
Un elenco delle funzioni fondamentali di XPath è il
seguente:
Funzioni che riguardano l’insieme dei nodi:
fn:last() – Restituisce il numero di elementi nella node list che
viene processata.
Example: /book[last()]
Risultato: Seleziona l’ultimo elemento book
fn:position() – Restituisce l’indice della posizione del nodo che
viene processato.
Example: /book[position()<=3]
Risultato: Seleziona i primi tre elementi book
fn:count((item, item…)) – Restituisce il numero di nodi;
fn:id((string, string,… ), node) – Restituisce una sequenza di
nodi che hanno ID il cui valore è uguale a uno o più valori
specificati.
Funzioni XPath
Funzioni che riguardano l’insieme dei nodi:
fn:namespace-uri() – Restituisce il namespace URI del nodo
corrente;
fn:name() – Restituisce il nome del nodo corrente;
Funzioni che riguardano le Stringhe:
fn:string(arg) – Restituisce il valore stringa dell’argomento
Example: string(314)
Result: "314"
fn:concat(string, string, ..) – Restituisce la concatenazione
delle stringhe.
Example: concat('XPath ','is ','FUN!')
Result: 'XPath is FUN!'
fn:starts-with() – Restituisce vero se seting1 inizia con string2,
falso altrimenti.
Example: starts-with('XML','X')
Result: true
Funzioni XPath
{substringafter()} – Restituisce
la parte a sinistra di string1 prima che string2 si
presenti.
Example: substring-before('12/10','/')
Result: '12'
fn:substring(string,start,len) – Restituisce la
sottostringa a partire dalla posizione start fino alla
lunghezza specificata. L’indice del primo carattere è 1.
Example: substring('Beatles',1,4)
Result: 'Beat'
fn:stringlength(string) – Restituisce la lunghezza
della stringa.
fn:substring-before()
Funzioni XPath
Funzioni Numeriche:
– Restituisce il valore
numerico dell’argomento.
Example: number('100')
Result: 100
fn:sum(arg, arg, …) – Restituisce la somma
degli argomenti.
fn:round() - Example: round(3.14)
Result: 3
fn:number(arg)
File XML di esempio
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
Esempi
Esempi
Riferimenti
http://www.w3schools.com/xpath;
www.w3.org/TR/xpath;
Libro di testo “An introduction to XML”
Esercizi
<bib>
<book price=“55”>
<publisher>Addison-Wesley</publisher>
<author>Serge Abiteboul</author>
<author><first-name>Rick</first-name>
<last-name>Hull</last-name>
</author>
<author>Victor Vianu</author>
<title>Foundations of Databases</title>
<year>1995</year>
</book>
<book> <publisher>Freeman</publisher>
<author>Jeffrey D. Ullman</author>
<title>Principles of Database and Knowledge Base Systems</title>
<year>1998</year>
</book>
</bib>
Esercizi
Qual’è la forma abbreviata per:
/child::bib/child::book
/child::bib/child::book/attribute::price
/descendant-orself::node()/child::author/parent::node()
Esercizi
Cosa
producono queste espressioni?
/bib/book/author[first-name]
/bib/book/author[first-
name][address[zip][city]]/last-name