# Basi di dati in XML

Possiamo rappresentare le basi di dati con documenti XML strutturati secondo regole in documenti schema-specification. Il linguaggio XML è detto semistrutturato perché i suoi nodi possono contenere un numero arbitrario di figli. In questa lezione si dà per conosciuta la sintassi dei documenti XML (si veda la lezione XML).
Oggi XML è usato nell'ambito delle basi di dati principalmente come strumento di scambio di dati tra sistemi non compatibili. Convertire i dati dal proprio formato a XML permette di rendere le informazioni accessibili anche da altri sistemi (a patto, ovviamente, che siano in grado di interpretare XML). La rapida diffusione di XML nata con internet, è dovuta alla sua semplicità e flessibilità, che permette di strutturare i dati in modo gerarchico ma completamente indipendente dal software e dall'hardware usato, in quanto conservato in semplici file di testo.

## Linguaggi di interrogazione

I linguaggi di interrogazione o query language sono linguaggi utilizzati per interrogare una base di dati, nel nostro caso per estrarre dati dai documenti XML.

### XPath

XPath è stato creato dal W3C nel 1999 (versione 1.0) per essere utilizzato con XSLT e successivamente aggiornato alle versioni 2.0 (2004) e 3.0 (2014). Espressioni utilizzate in XPath:
| espressione | significato |
| nodo | Seleziona tutti i figli del nodo indicato |
| / | Seleziona dal nodo radice |
| // | Seleziona dal nodo corrente in tutto il documento |
| . | Seleziona il nodo corrente |
| .. | Seleziona il padre del nodo corrente |
| @ | Seleziona gli attributi |
Spieghiamo con degli esempi XPath. Esempio: sia scuola.xml:
Allora le query:
* doc("scuola.xml")/root/class ritornerà:
* doc("scuola.xml")/root/class[2] ritornerà:
* doc("scuola.xml")/root/class[teacher="Alessandro Selo"]/student ritornerà:

#### Sottoelementi

È possibile estrarre tutti i sottoelementi indipendentemente dal loro livello. Ad esempio se vogliamo estrarre tutti gli studenti della scuola:
otterremo:

#### Predicati

I predicati si utilizzano per trovare un nodo specifico secondo alcune condizioni e proprietà del nodo cercato. Possiamo suddividerle in:
* doc("libreria.xml")/scaffale/libro[2] ottiene il secondo libro che compare in ordine in scaffale
* doc("libreria.xml")/scaffale/libro[last] ottiene l'ultimo libro in scaffale
* doc("libreria.xml")/scaffale/libro[position<4] ottiene i primi 3 libri in scaffale
* doc("libreria.xml")//libro[@pagine<200] estrae i libri con meno di 200 pagine (dove pagine è un attributo di libro. Se non è presente l'operatore, ad esempio libro[@pagine] si indica che l'attributo esiste o meno)

### XQuery

XQuery è un linguaggio diventato standard W3C che fornisce un metodo per interrogare basi di dati XML, similmente a come SQL interroga basi di dati relazionali. Utilizza una sintassi simile a XPath per definire espressioni di ricerca.
Le XQuery sono costituite dalle espressioni FLWOR (For-Let-Where-OrderBy-Return), la cui sintassi base è:
Questa espressione assomiglia a un foreach nei comuni linguaggi di programmazione; il for cicla su tutti gli elementi dell'array (nel nostro caso tutti i tag ritornati da doc(..)...) ed esegue le istruzioni sottostanti (nel nostro caso ritornando semplicemente tutti gli elementi).
Si possono anche costruire nuovi elementi. Ad esempio, sfruttando l'esempio della libreria:
Abbiamo introdotto un nuovo costrutto: let permette di creare nuove variabile e aggregare i dati del for. Se avessimo messo $book direttamente nel return, avremmo ottenuto un tag <libriPrestati> per ogni libro e non uno per tutti. Il risultato di questa query sarà:
Similmente a SQL possiamo usare clausole where con dati aggregati (si noti che per i dati non aggregati si possono utilizzare semplicemente le condizioni di XPath). Ad esempio se vogliamo ottenere tutti gli scaffali con più di 10 libri ordinati per id:

## Database relazionali e XML

Alcuni DBMS relazionali supportano anche il formato XML dei dati. In questo caso essi di norma accettano sia i linguaggi di interrogazione SQL sia quelli di XML (come XQuery). I dati vengono comunque gestiti come relazioni e la parte di XML è visibile solo in fase di presentazione delle informazioni.
In base alla tecnologia scelta, il formato del documento XML può essere fisso rispetto a un DTD, variabile consegnando il DTD con l'XML oppure ricostruito a discrezione del DBMS.