XPath Corso di basi di dati II Prof. Francesco Cutugno Dott. Sara Romano.

Post on 01-May-2015

221 views 4 download

transcript

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