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
bib
book book
publisher author . . . .
Addison-Wesley Serge Abiteboul
The root
The root element
price=55
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
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.
XQueryXSLT XPath
PathsOperating 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
/library/book/chapter/section = tutti gli elemente section in un chapter in ogni book nella library
. = la directory corrente . = l’ elemento corrente
.. = 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
prova = il file (o directory) chiamato prova nella directory corrente
section = ogni elemento section che è figlio dell’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: esempiPartendo 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
paragraph[1] paragraph[2]
section[1]
chapter[2]chapter[1] chapter[3]
book[1] book[2]
library
self
ancestor
descendant
preceding
following
Partendo da un nodo, gli axis self, preceding, following, ancestor, e descendant si comportano nel seguente modo:
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 + addizione - sottrazione * moltiplicazione div divisione (non si può usare /) modmodulo
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 fn:substring-before() {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.
Funzioni XPath
Funzioni Numeriche: fn:number(arg) – 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
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-or-self::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
Top Related