Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

XQuery

XQuery: recuperare le informazioni memorizzate all'interno di un file XML
XQuery: recuperare le informazioni memorizzate all'interno di un file XML
Link copiato negli appunti

In questo capitolo analizziamo una tecnologia ideata per il recupero delle informazioni memorizzate all'interno di un file XML. È molto importante per la diffusione e l'utilizzo di XML nell'ambito di documenti contenenti grandi quantità di dati, avere a disposizione uno strumento relativamente facile e potente per poter recuperare l'informazione presente in un file XML.

Questo strumento deve permettere di realizzare delle query (interrogazioni) sul documento proprio come avviene ad esempio con il linguaggio SQL nel caso dei database relazionali.

XML Query languge (XQuery) nasce proprio con l'intento di realizzare un linguaggio per recuperare agevolmente le informazioni da un documento XML ed andare a costituire una sorta di "SQL per XML".
XQuery non è un linguaggio basato su XML ed è costituito da una sintassi semplice e facilmente leggibile per formulare, nel modo più agevole possibile, le query sui dati. Il working group del W3C ha sviluppato anche ua versione di XQuery con sintassi XML, chiamata XQueryX di cui parleremo in seguito.

Prima di iniziare a parlare in dettaglio di XQuery, introduciamo il documento XML di esempio che utilizzeremo per realizzare le query nel corso degli esempi.

Consideriamo l'esempio di un documento XML (chiamato arch_libri.xml) nel quale sono memorizzate le informazioni relative ad un archivio formato da numerosi libri dove, per ogni libro, l'informazione viene strutturata nel seguente modo (per semplicità ne riportiamo solamente la struttura base):

<libro>
  <titolo>Titolo_del_libro</titolo>
  <autore>Autore_del_libro</autore>
  <editore>Editore_del_libro</editore>
  <prezzo>Prezzo_del_libro</prezzo>
</libro>

Una query in XQuery è costituita da un'espressione che legge una sequenza di nodi XML od un singolo valore e restituisce come risultato una sequenza di nodi od un singolo valore. Le espressioni XQuery sono composte da espressioni XPath per individuare i nodi da analizzare e da delle funzionalità aggiuntive specifiche di XQuery per il recupero delle informazioni.

Esempio di query

document("arch_libri.xml")//libro[prezzo > 50] SORTBY (autore)

Questa query ricerca all'interno del nostro documento d'esempio tutti i nodi <libro> che hanno un prezzo maggiore di 50 e ordina il risultato in funzione del nome dell'autore.

L'espressione principale utilizzata in XQuery, per formulare interrogazioni complesse, è quella che viene chiamata espressione FLWR (For-Let-Where-Return).
Questa espressione costituisce una generalizzazione del costrutto SELECT-FROM-HAVING-WHERE del linguaggio SQL e se avete già dimestichezza con le query SQL sarete sicuramente avvantaggiati nella comprensione degli esempi di espressioni XQuery.

Consideriamo il seguente esempio:

FOR $e IN document("arch_libri.xml")//editore
LET $l := document("arch_libri.xml")//libro[editore=$e]
WHERE count($l) > 5
RETURN
  <risultato>
    {$e}
  </risultato>

La prima istruzione crea una lista (associata alla variabile '$e') contenente tutti gli editori presenti nel nostro archivio. La seconda riga associa a ciascun editore, la lista dei libri da lui editi (variabile '$l'), andando a creare una lista ordinata di tuple formate da ($e,$l). Tramite la terza riga, determiniamo un filtro sulla risposta andando a considerare solamente gli editori hanno pubblicato più di cinque libri. L'ultima istruzione (RETURN) crea il risultato inserendo all'interno di un elemento chiamato <risultato>, i nodi <editore> che soddisfano i criteri della nostra query.

La funzione count() presente in questo esempio è una delle funzioni che XQuery matte a disposizione per operare sulle liste di elementi. Le funzioni principali che XQuery offre oltre a count() (che restituisce il numero di elementi presenti) sono:

  • avg(), per calcolare il valor medio dei valori degli elementi
  • union(), intersection(), difference() che realizzano operazioni 'insiemistiche' sugli elementi.

Costrutti particolari

XQuery supporta anche il costrutto IF-THEN-ELSE all'interno delle sue espressioni. Ad esempio:

FOR $l IN document("arch_libri.xml")//libro
RETURN
  <risultato>
    {
      IF ($l/editore ='Editore1')
      THEN $l/titolo
      ELSE $l/autore
    }
  </risultato>

Il risultato di questa query contiene i titoli dei libri se l'editore è 'Editore1', altrimenti il nome degli autori dei libri delle altre case editrici.

Altri due costrutti molo utili in XQuery sono SOME-IN-SATISFIES e EVERY-IN-SATISFIES, che permettono di verificare determinate proprietà per gli elementi contenuti in una lista.

Ad esempio:

FOR $l IN document("arch_libri.xml")//libro
WHERE SOME $t IN $l/titolo SATISFIES (contains($t,"XML") AND contains($t,"tutorial"))
RETURN
  <risultato>
    { $l/titolo }
  </risultato> FOR $l IN document("arch_libri.xml")//libro
WHERE EVERY $t IN $l/titolo SATISFIES contains($t,"XML")
RETURN
  <risultato>
    { $l/titolo }
  </risultato>

La prima query restituisce come risultato il titolo di tutti i libri nei cui titoli compare contemporaneamente sia la stringa 'XML' che la stringa 'tutorial'; mentre la seconda query restituisce i titoli dei libri che contengono la stringa 'XML' nel loro titolo.

Le espressioni XQuery che abbiamo visto negli esempio di questo capitolo, possono essere formulate secondo una sintassi XML utilizzando il linguaggio XQueryX. XML Syntax for XQuery (XQueryX) è un linguaggio basato su XML per esprimere le interrogazioni XQuery e gli elementi che costituiscono la sua sintassi consentono di riprodurre, mediante tag XML, le espressioni XQuery che abbiamo analizzato in questo capitolo (FLWR, IF-THEN-ELSE, etc.)

Una versione XML delle espressioni XQuery è molto utile perchè ci permette di utilizzare tutti gli strumenti XML (parser XML, XSLT, etc.) per creare, analizzare e manipolare le query sui documenti XML.

Come esempio di interrogazione XQueryX, vediamo come un'espressione XQuery viene espressa secondo la sintassi XML di XQueryX. Consideriamo la seguente espressione XQuery che permette di ricercare i titoli di tutti i libri scritti da 'Mario Rossi':

FOR $l IN document("arch_libri.xml")//libro
WHERE $l/autore="Mario Rossi"
RETURN
  <risultato>
    $l/titolo
  </risultato>

L'equivalente espressione XQueryX è:

<q:query xmlnsns:q="http://www.w3.org/2001/06/xqueryx">
  <q:flwr>
    <q:forAssignment variable="$b">
      <q:step axis="SLASHSLASH">
        <q:function name="document">
          <q:constant datatype="CHARStrING">arch_libri.xml</q:constant>
        </q:function>
        <q:identifier>libro</q:identifier>
      </q:step>
    </q:forAssignment>
    <q:where>
      <q:function name="EQUALS">
        <q:step axis="CHILD">
          <q:variable>$l</q:variable>
          <q:identifier>autore</q:identifier>
        </q:step>
        <q:constant datatype="CHARStrING">Mario Rossi</q:constant>
      </q:function>
    </q:where>
    <q:return>
      <q:elementConstructor>
        <q:tagName>
          <q:identifier>risultato</q:indentifier>
        </q:tagName>
        <q:step axis="CHILD">
          <q:variable>$l</q:variable>
          <q:identifier>titolo</q:identifier>
        </q:step>
      </q:elementConstructor>
    </q:return>
  </q:flwr>
</q:query>

Dall'esempio appare evidente come ciascuna espressione XQuery venga mappata in un apposito tag XQueryX, andando a formare un'interrogazione costituita da una sintassi più complicata e meno leggibile rispetto alla versione XQuery, ma che può essere facilmente integrata ed utilizzata all'interno di un'applicazione XML.

Attualmente sia la specifiche di XQuery che di XQueryX sono ancora in fase di sviluppo e quindi potrebbero subire dei cambiamenti prima di raggiungere la fase di Raccomandazione Ufficiale. Potete trovare comunque maggiori informazioni sui linguaggi e sullo stato del lavoro del Working Group del W3C, andando a leggere i 'Working Draft' di XQuery e di XQueryX agli indirizzi: http://www.w3.org/tr/xquery e http://www.w3.org/tr/xqueryx.

Ti consigliamo anche