XPath Corso di basi di dati II Prof. Francesco Cutugno Dott. Sara Romano.
-
Upload
cristiano-spinelli -
Category
Documents
-
view
223 -
download
4
Transcript of XPath Corso di basi di dati II Prof. Francesco Cutugno Dott. Sara Romano.
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