400 likes | 577 Views
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);
E N D
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>
bib XML Tree 2/2 The root The root element book book publisher author price=55 . . . . Addison-Wesley Serge Abiteboul
<library><book><chapter> </chapter><chapter> <section><paragraph/> <paragraph/> </section></chapter></book></library> Un po’ di terminologia • 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 nodobook) 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..)
XSLT XPath XQuery 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.
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 /library/book/chapter/section= tutti gli elemente section in un chapter in ogni book nella library prova = il file (o directory) chiamato prova nella directory corrente section = ogni elemento section che è figlio dell’elemento corrente . = la directory corrente . = l’ elemento corrente .. = il padre dell’elemento corrente .. = la directory padre /users/sara/* = tutti i files in /users/dave /library/book/chapter/*= tutti gli elementi in /library/book/chapter
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 predicatoche 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 chefiltra 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::*
library ancestor following book[1] book[2] preceding self chapter[1] chapter[2] chapter[3] section[1] descendant paragraph[2] paragraph[1] Axis: vista ad albero 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 /) • mod 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 • 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>
Riferimenti • http://www.w3schools.com/xpath; • www.w3.org/TR/xpath; • Libro di testo “An introduction to XML”
Esercizi <bib> <bookprice=“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