cerca
Basi di Dati - Complementi - XPath
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Basi di Dati - Complementi - XPath

 :: Basi di Dati - Complementi ::

XPath

Cos'è

Così come per le basi di dati, anche le informazioni contenute nei documenti XML possono essere oggetto di interrogazione. Il linguaggio utilizzato a questo scopo è l'XQuery, che sfrutta la sintassi e alcune funzionalità di un secondo linguaggio, l' XPath.

Al contrario del DTD o dell'XSD, lo scopo dell' XPath non è definire la struttura di un documento XML, ma indirizzarne delle porzioni, così da permettere la navigazione e la ricerca al suo interno. Il principio è che un documento XML può essere rappresentato come un albero di nodi, quindi possono essere sfruttati tutti gli algoritmi di ricerca e di visita per muoversi al suo interno.

Dal 16 novembre 1999 l'XPath è felicemente diventato W3C recommendation.

Path Expression

Sfruttando la struttura dati albero, è possibile individuare ogni singolo nodo tenendo traccia del cammino che lo collega alla radice o al nodo corrente, ovvero attraverso la sua path expression. Essa rappresenta il fondamento di un'interrogazione XPath, e la sua valutazione restituisce l'insieme degli elementi del documento raggiungibili seguendo il percorso specificato dalla path expression stessa. Gli oggetti che possono essere ritornati sono: nodo singolo o insieme di nodi (non ordinato e privo di duplicati), booleani, numeri (in virgola mobile) e stringhe.

Ogni elemento che compone una path expression è separato dall'altro attraverso il simbolo /, con una notazione molto simile a quella che individua la posizione di un file nel file system. Gli elementi sono caratterizzati da tre componenti:

  • axis, che definisce la relazione esistente tra il nodo corrente e quello di riferimento. In altre parole, indica il senso di percorrenza dell'albero del documento XML
  • node test, che individua un nodo in particolare o fornisce un'espressione più generale per riferirsi a uno o più
  • predicati, sono delle espressioni che esprimono alcune condizioni da soddisfare perché il nodo possa essere preso in considerazione

Sintassi

Per l'XPath esistono due tipi di sintassi, una abbreviata che permette di creare interrogazioni semplici e intuitive, ed una completa che guadagna in specificità aumentando tuttavia la complessità dei suoi costrutti. In questa sede vedremo solo la prima, più compatta.

Una path expression può iniziare con due simboli:

  • /, che individua un cammino assoluto, ovvero la sequenza di elementi che individua il suo percorso ha origine nella radice. Ad esempio /swappa/persone/docenti seleziona gli elementi che si trovano nel documento XML seguendo una sequenza che parte dall'elemento swappa, passa al sotto-elemento persone, quindi a docenti
  • //, e restituisce tutti gli elementi che soddisfano il criterio di selezione, indipendentemente da come saranno raggiunti. Ad esempio //periferiche trova tutti gli elementi di tipo periferiche all'interno del documento, ovunque si trovino
  • se non ci sono simboli prima del primo elemento, significa che è un nodo del contesto corrente

Gli axis utilizzati nella sintassi abbreviata sono:

  • @ che individua un attributo del nodo corrente
  • / che indica il nodo radice o il figlio del nodo corrente
  • // che si riferisce al discendente del nodo corrente
  • . il nodo corrente
  • .. che individua il nodo padre del nodo corrente

Per quanto riguarda i node test, diciamo solo che con il simbolo asterisco * è possibile riferirsi ad un elemento qualsiasi. Tre esempi illuminanti: /cocktail/* seleziona tutti gli elementi contenuti nell'elemento cocktail; /*/* seleziona tutti gli elementi al secondo livello di annidamento; /locandine/@* seleziona tutti gli attributi contenuti nell'elemento locandine.

I predicati vanno inseriti tra parentesi quadre, ed esprimono condizioni logiche che gli elementi risultato devono rispettare. Nella fase di scrittura di tali condizioni è possibile utilizzare sia operatori logici che aritmetici, oltre a un certo numero di funzioni predefinite:

  • operatori di unione: |
  • operatori booleani: and, or e la funzione not()
  • operatori aritmetici: +, -, *, div e mod
  • operatori di confronto: =, !=, <, >, <= e >=
  • infine, inserire un intero tra parentesi quadre ([n]) seleziona l'n-simo discendente del nodo corrente

Tra le funzioni ricordiamo:

  • position(), che specifica la posizione di un elemento
  • last(), che specifica l'ultima posizione di una sequenza di elementi
  • count(), che restituisce il numero di elementi relativi all'espressione passata come argomento. Ad esempio count(//libri) restituisce il numero di elementi libri del documento XML
  • string() converte il valore passato come parametro in una stringa
  • string-length() indica il numero di caratteri che compongono la stringa specificata come parametro
  • concat() concatena le stringhe passate come parametro
  • number() converte il valore passato come parametro in un numero
  • round() arrotonda un numero all'intero più vicino
  • not(booleano) nega l'espressione booleana

Esempi

Utilizzeremo per i nostri esempi il seguente documento libri.xml

<?xml version="1.0"?>
<Elenco>
  <Libro disponibilità="N">
    <Titolo>Il nome della rosa</Titolo>
    <Autore>Umberto Eco</Autore>
    <Data>1987</Data>
    <ISBN>55-344-2345-1</ISBN>
    <Editore>Bompiani</Editore>
  </Libro>
  <Libro disponibilità="S">
    <Titolo>Il sospetto</Titolo>
    <Autore>F. Dürrenmatt</Autore>
    <Data>1990</Data>
    <ISBN>88-07-81133-2</ISBN>
    <Editore>Feltrinelli</Editore>
  </Libro>
</Elenco>
1. Elenco semplice

"Trova tutti i libri nell’elenco all’interno del documento"

Path expression:
document(“libri.xml”)/Elenco/Libro

Commento:
Seleziona tutti gli elementi Libro contenuti in Elenco.

XML risultante:
<Libro disponibilità="N">
  <Titolo>Il nome della rosa</Titolo>
  <Autore>Umberto Eco</Autore>
  <Data>1987</Data>
  <ISBN>55-344-2345-1</ISBN>
  <Editore>Bompiani</Editore>
</Libro>
<Libro disponibilità="S">
  <Titolo>Il sospetto</Titolo>
  <Autore>F. Dürrenmatt</Autore>
  <Data>1990</Data>
  <ISBN>88-07-81133-2</ISBN>
  <Editore>Feltrinelli</Editore>
</Libro>
2. Operatori booleani e predicati su attributi

"Trova tutti i titoli dei libri dell’editore Feltrinelli che sono disponibili e che si trovano nel documento"

Path expression:
document("libri.xml")/Elenco/Libro[Editore=“Feltrinelli" AND 
                                   @disponibilità="S"]/Titolo

Commento:
Applica due condizioni entrambe vincolanti, la seconda delle quali si applica a un attributo dell'elemento Elenco.

XML risultante:
<Titolo>Il sospetto</Titolo>

3. Ricerca indipendente dai cammini

"Trova l’insieme di tutti gli autori che si trovano nel documento annidati a qualunque livello"

Path expression:
document("libri.xml")//Autore

Commento:
Seleziona tutti gli elementi di tipo Autore, ovunque si trovino all'interno del documento. In questo caso si trovano entrambi allo stesso livello, ma il principio vale in generale.

XML risultante:
<Autore>Umberto Eco</Autore>
<Autore>F. Dürrenmatt</Autore>
4. Operatori booleani e predicati su attributi

"Trova gli elementi contenuti nel primo libro del documento"

Path expression:
document("libri.xml")/Elenco/Libro[1]/*

Commento:
Seleziona tutti i sotto-elementi del primo elemento Libro.

XML risultante:
<Titolo>Il nome della rosa</Titolo>
<Autore>Umberto Eco</Autore>
<Data>1987</Data>
<ISBN>55-344-2345-1</ISBN>
<Editore>Bompiani</Editore>

Torna alla pagina di Basi di Dati - Complementi