Bases de dades natives XML. Llenguatge de consultes (XQuery)

Els fitxers en XML estan en un format de text estandarditzat que serveix per representar, emmagatzemar i transportar informació estructurada. Per tant l’XML es pot fer servir com a mètode d’emmagatzematge de dades neutre, ja que la informació emmagatzemada en fitxers XML es pot moure d’una màquina a una altra sense que hi hagi problemes. Això el fa un mètode ideal per emmagatzemar dades històriques que ens assegura que es podran tornar a llegir en el futur sense problemes.

Això ha fet que les organitzacions cada vegada tinguin una quantitat més gran de documents XML, i que en conseqüència localitzar els documents en el moment adequat sigui cada cop més complicat. Per tant cal alguna manera d’organitzar les dades XML que permeti localitzar-les ràpidament.

Però no solament n’hi ha prou de localitzar els documents, ja que sovint el que es busca estarà repartit en diferents documents. També cal alguna manera de poder consultar i manipular les dades que contenen els fitxers XML. Aquest sistema de consulta ha de ser capaç de fer cerques en els documents i modificar-ne dades si cal, però sempre mantenint uns mínims d’eficiència.

Davant d’aquestes necessitats la solució se sol donar de dues maneres:

  1. Com que majoritàriament les organitzacions ja tenen sistemes d’emmagatzematge organitzats de dades basats en dades relacionals una possible solució podria ser convertir els fitxers XML a dades relacionals:
    • L’emmagatzematge de dades serà totalment organitzat i centralitzat en un punt on ja hi ha les altres dades de l’organització.
    • El seu llenguatge de consulta, SQL, és molt conegut i es fa servir molt, de manera que no caldrà que els usuaris aprenguin un nou llenguatge.
  2. Una altra solució consisteix a crear un sistema d’emmagatzematge pensat només per als fitxers XML. Són els sistemes coneguts com a bases de dades natives XML. Aquests:
    • Proporcionen un lloc per emmagatzemar ordenadament fitxers XML.
    • Tenen el seu llenguatge de consulta propi: XQuery.

Tot i que en la teoria és fàcil fer aquesta distinció, en la pràctica molt sovint les organitzacions fan servir sistemes d’emmagatzemament mixtos, en els quals desen en dades relacionals aquelles dades que han de ser emmagatzemades o consultades, i en XML aquelles dades que han de ser representades en entorns web o que s’han d’intercanviar o transportar a altres sistemes.

L’objectiu d’aquest mòdul no és ser expert en bases de dades, per tant només veurem alguns exemples de coses que es poden fer en base de dades per treballar amb XML

Bases de dades relacionals

Gairebé totes les organitzacions tenen les seves dades organitzades amb algun sistema relacional, ja que els sistemes gestors de bases de dades s’han convertit en un element indispensable en el funcionament de les empreses. Es fan servir per controlar moltes de les dades de funcionament de les empreses: facturació, comptabilitat, estocs…

Per tant, davant de l’aparició d’un nou tipus de dades, un dels raonaments fàcils seria: “si ja tenim un sistema d’organització de dades que funciona bé, per què no podem posar aquestes dades en el mateix sistema?”. D’aquesta manera, les dades que s’obtinguessin dels fitxers XML aconseguirien un sistema molt eficient d’emmagatzematge i un mètode de manipulació d’informació que ha estat molt provat durant molts anys i que coneix molta gent.

La inclusió dels fitxers XML en els sistemes gestors de bases de dades relacionals es pot fer de dues maneres:

  1. Convertir les dades dels fitxers XML en dades relacionals:
    • Aquest sistema té l’avantatge que les dades, un cop dins del sistema relacional, seran idèntiques a les ja existents.
    • L’inconvenient més important és que si torna a fer falta el document XML original pot ser molt difícil regenerar-lo, ja que sovint hi haurà informació sobre l’estructura XML que no s’emmagatzemarà.
  2. Emmagatzemar els documents XML sencers en les bases de dades:
    • Es posaran els fitxers XML sencers en un camp d’una taula de la base de dades, de manera que serà com les altres dades.
    • Per poder-hi treballar bé caldrà que la base de dades ofereixi alguna manera mitjanament eficient de poder fer cerques en el contingut dels documents XML.

Convertir les dades XML en relacionals

Una solució que pot semblar senzilla però que en realitat no n’és tant consisteix a agafar les dades dels fitxers XML i transformar-les en dades relacionals. Un cop s’hagin incorporat les dades a la base de dades es podran eliminar els fitxers XML.

Com que en el document XML ja hi ha definida l’estructura de les dades, i sovint els documents XML estaran associats a un vocabulari, tindrem que:

  • Generar l’estructura de taules relacionals es pot fer analitzant l’estructura del document XML.
  • Es poden obtenir els camps de la definició del vocabulari o simplement observant el contingut del document XML.

Vegeu XSLT en l’apartat “Conversió i adaptació de documents XML” d’aquesta unitat.

I a més hi ha sistemes que permeten transformar dades XML en altres tipus de fitxers (per exemple, XSLT).

Convertir un document XML en dades relacionals

Si es parteix del document XML següent:

  1. <?xml version="1.0"?>
  2. <alumnes>
  3. <alumne>
  4. <nom>Frederic</nom>
  5. <cognom>Pi</cognom>
  6. </alumne>
  7. <alumne>
  8. <nom>Filomeno</nom>
  9. <cognom>Garcia</cognom>
  10. </alumne>
  11. </alumnes>

És relativament senzill veure que l’estructura del document consisteix en una llista d’elements <alumne>. I que els <alumne> tindran dos camps de dades que són <nom> i <cognom>.

Per tant, l’estructura relacional d’aquest fitxer serà simplement crear una taula ‘alumne’ que tingui com a dades un nom i un cognom. Això és trivial amb l’ordre CREATE TABLE d’SQL:

  1. CREATE TABLE alumne (nom VARCHAR(30), cognom VARCHAR(30))

Obtenir les dades per emplenar la taula tampoc no ha de ser un problema gaire gran. Simplement cal fer INSERT de cada camp de dades:

  1. INSERT INTO alumne VALUES("Frederic", "Pi");
  2. INSERT INTO alumne VALUES("Filomeno", "Garcia");

Per no haver-ho de fer manualment el més fàcil seria crear una plantilla XSLT que faci la transformació del fitxer XML en les regles SQL.

A pesar de l’aparent senzillesa d’aquest sistema, no sempre és senzill fer aquesta conversió, ja que els sistemes relacionals i XML parteixen de conceptes bastant diferents:

  • El sistema relacional està basat en dades bidimensionals sense jerarquia ni ordre, mentre que el sistema XML està basat en arbres jeràrquics en què l’ordre és significant.
  • En un document XML hi pot haver dades repetides, mentre que els sistemes relacionals fugen de les repeticions.
  • Les relacions i les estructures dins dels documents XML no sempre són òbvies.
  • Què passa si necessitem tenir el document XML de nou? Fer el procés invers no sempre és trivial. Un dels conceptes difícils és determinar quines dades eren atributs i quines elements.

Per tant, normalment aquest no és el sistema més aconsellable però és un sistema vàlid que pot ser útil en casos concrets.

Sistemes relacionals amb extensions XML

Fins a l’aparició d’XML pràcticament tothom emmagatzemava les dades que s’havien de consultar o modificar ràpidament per mitjà d’algun sistema relacional. Els sistemes gestors de bases de dades han estat durant anys els reis de l’administració de dades en les organitzacions.

Però l’increment d’informació en XML que s’havia de poder consultar o que es requeria per fer tasques que abans estaven reservades a les bases de dades relacionals ha provocat que s’hagi hagut d’incloure algun tipus de suport XML en els sistemes gestors de bases de dades.

Tots els grans sistemes de bases de dades importants com Oracle, IBM DB2 o Microsoft SQL Server tenen algun tipus de suport per a XML, que normalment es concreta en el següent:

  • Permetre exportar les dades relacionals en algun format XML per transportar les dades.
  • Tenir alguna manera de poder emmagatzemar documents XML com a camps en taules relacionals.
  • Permetre fer cerques i canvis en els documents XML emmagatzemats.
  • Generar XML a partir de les dades relacionals de la base de dades.

A pesar que SQL/XML forma part de l’estàndard SQL, no tots els gestors de bases de dades el suporten.

Com que SQL (el llenguatge de consulta de dades relacional per excel·lència) no tenia suport per a XML el 2003, es va modificar l’estàndard del llenguatge SQL per afegir l’extensió SQL/XML.

SQL/XML

SQL/XML és una extensió de l’estàndard SQL que permet treballar amb el llenguatge XML per mitjà d’instruccions SQL.

Aquesta extensió va ser desenvolupada per un grup en el qual hi havia les grans empreses de bases de dades (Microsoft, Oracle, IBM, SyBase, DataDirect Tecnologies…) i ja està implementada en algun sistema de bases de dades.

A pesar de participar en l’elaboració de l’estàndard, Microsoft va anunciar que no tenia intenció d’incorporar SQL/XML en el Microsoft SQL Server. En comptes d’això, el Microsoft SQL Server fa servir un sistema propi anomenat Microsoft SQLXML o OPENXML per treballar amb SQL i XML.

SQL/XML defineix tota una sèrie de funcions per a publicació de fitxers XML a partir de dades relacionals, defineix un tipus de dades XML i una manera de consultar i manipular les dades XML emmagatzemades.

SQL/XML a Oracle

Oracle és un dels sistemes gestors de bases de dades més importants del mercat i, per tant, no podia no donar suport als documents XML. Per fer-ho defineix el tipus de dades XMLType, que serveix per emmagatzemar XML com si es tractés d’un tipus de dades més en les taules.

Per tant, fent servir XMLType es pot crear una taula amb un camp amb documents XML i treballar-hi com si fossin dades relacionals normals.

  1. CREATE TABLE alumnes(ID INT NOT NULL, document XMLTYPE);

En la figura podem veure la descripció d’una taula SQL que conté XML en Oracle.

Figura Descripció de la taula amb un camp XMLType

XMLType permet emmagatzemar els documents XML amb la definició de l’esquema o sense.

  1. Amb l’esquema XSD el sistema pot saber de quin tipus són les dades de cada element XML, i per tant, internament pot organitzar les dades de manera que sigui possible fer-hi cerques més eficients. A més, en conèixer el contingut de les etiquetes es podran fer operacions amb aquestes de la mateixa manera que es fa amb les altres dades
  2. Si no es proporciona l’esquema els XML seran tractats com un camp de text i les cerques seran menys eficients.

L’entrada de dades XML a una taula Oracle es pot fer amb la instrucció habitual però especificant el camp XML amb el tipus XMLTYPE.

  1. INSERT INTO alumnes VALUES (1,
  2. XMLTYPE('<persona><nom>Pere</nom></persona>'));

També es poden consultar els valors XML de la manera habitual (figura).

Figura Consulta dels valors de la base de dades

Per fer cerques Oracle proporciona una sèrie de funcions que permeten que a un camp XML se li puguin extreure dades fent servir XPath, comprovar l’existència de determinats nodes, crear-hi nodes nous, etc…

Per exemple, es poden extreure tots els elements <nom> d’un camp XML d’una taula fent servir una ordre com la següent (figura):

  1. SELECT EXTRACT(document,'//nom/text()') "noms"
  2. FROM alumnes;
Figura Consulta SQL amb XPath

També pot caldre generar documents XML a partir de les dades que hi ha emmagatzemades en la base de dades. Oracle ho pot fer de diverses maneres:

  • Per mitjà d’SQL/XML.
  • Per mitjà del paquet DBMS_XMLGEN, que permet crear XML a partir de consultes.
  • Amb la funció SYS_XMLGEN, que crea un document XML per a cada registre resultat d’una consulta.
  • Fent servir la utilitat XSU, que és específica per desenvolupar en Java.

Per exemple, fent servir l’estàndard SQL/XML disposem d’una sèrie de funcions per generar contingut XML, especificant-les en la consulta SQL (taula).

Taula: Algunes funcions SQL/XML
Funció Ús
XMLELEMENT Permet crear un element amb un nom determinat
XMLATTRIBUTES Es fa servir per crear atributs dins d’un element
XMLCONCAT Concatena múltiples etiquetes
XMLFOREST Crea elements XML a partir d’un grup de resultats

Amb aquestes funcions es pot generar XML a partir una taula SQL que contingui els camps nom i cognom com la (figura).

Figura Taula relacional ‘Professors’

Amb la instrucció següent:

  1. SELECT xmlelement('alumne', xmlforest(a.nom, a.cognom))
  2. FROM alumnes;

La figura mostra quin és el resultat d’executar-la en l’Oracle.

Figura Generar XML a partir de dades relacionals

XQuery

Una de les necessitats més bàsiques a l’hora de poder fer cerques en les dades és disposar d’un llenguatge per fer consultes que sigui prou potent per poder cobrir les necessitats dels que l’han de fer servir. Per aquest motiu es va desenvolupar el llenguatge XQuery.

XQuery és un llenguatge de consultes pensat per convertir-se en la manera estàndard de recuperar dades de col·leccions de documents XML.

Es tracta d’un llenguatge funcional, de manera que en comptes de dir-li quines són les passes per fer una tasca el que es fa és avaluar les expressions contra el fitxer XML i generar un resultat. A diferència dels llenguatges de programació habituals, en XQuery s’especifica què és el que es vol i no la manera com ho ha de fer per obtenir-ho.

Xquery 3.0

Ja està en desenvolupament una nova versió d’XQuery que permetrà incrementar la potència de les consultes tot afegint clàusules noves com group by o el control d’errors dinàmics. La podeu consultar a www.w3.org/TR/xquery-30

Entre les característiques més interessants d’XQuery, aquest permet:

  • Seleccionar la informació segons criteris. Ordenar, agrupar, afegir dades.
  • Filtrar la informació que es vulgui del flux de dades.
  • Cercar informació en un document o en un grup de documents.
  • Unir dades de múltiples documents.
  • Transformar i reestructurar XML.
  • No estar limitat a la cerca, ja que pot fer operacions numèriques i de manipulació de caràcters.
  • Pot treballar amb espais de noms i amb documents definits per mitjà de DTD o XSD.

Una part important d’XQuery 1.0 és el llenguatge XPath 2.0, que és la part que li permet fer les seleccions d’informació i la navegació pel document.

Processadors XQuery

L’avaluació d’expressions XQuery requerirà disposar d’algun processador XQuery.

Els processadors XQuery agafen els documents XML d’entrada i els apliquen una transformació per generar un resultat.

En la figura es pot veure quin és el funcionament d’un processador XQuery.

Figura Funcionament dels processadors XQuery

Normalment els processadors XQuery venen en forma de biblioteques que es poden incorporar als programes. Molts sistemes de base de dades o programes incorporen aquestes biblioteques per poder donar suport XQuery en els seus productes.

Saxon

Probablement una de les biblioteques més usades i amb millor suport per a XQuery és Saxon.

En la seva versió gratuïta (Saxon Home Edition) a part de les biblioteques s’instal·len dos executables que serveixen per fer transformacions i per avaluar expressions XQuery: Transform i Query.

Podem executar XQuery simplement executant l’executable amb el fitxer amb les expressions:

  1. C:\> Query consulta.xquery

Normalment la majoria de distribucions Linux tenen la versió lliure de Saxon en el seu repositori d’aplicacions. Per exemple, per al sistema Ubuntu, es troba en la biblioteca libsaxonb-java i la instrucció és saxonb-xquery.

  1. $ saxonb-xquery consulta.xquery
Kernow
Figura Avaluació amb el Kernow

El Kernow és un programa molt popular que fa servir Saxon i que permet fer avaluacions XQuery des d’un entorn gràfic per mitjà del que anomena XQuery Sandbox (figura). Es pot baixar des de http://kernowforsaxon.sourceforge.net/.

A part d’avaluar expressions XQuery aquest programa també ofereix altres possibilitats de la biblioteca Saxon, com fer transformacions XSLT, etc.

XQilla

L’XQilla és un programa que corre sobre la biblioteca Xerces i que permet fer avaluacions Xquery des de l’entorn d’instruccions.

  1. $ xqilla consulta.xquery

Altova

Altova és l’empresa que desenvolupa un editor XML anomenat Altova XMLSpy, que és bastant popular en entorns Windows. Entre les eines gratuïtes que ofereix hi ha unes utilitats per processar XQuery i XSLT des de consola.

Es pot processar una petició XQuery amb:

C:\> altovaxml /xquery consulta.xquery

Editors XML

Molts dels editors XML estan enllaçats amb biblioteques per processar XQuery i des de l’entorn mateix de l’editor permeten editar, provar i depurar les peticions XQuery (figura).

Figura Prova d’edicions XQuery en l’oXygen XML Editor

A més d’altres avantatges com els assistents d’ajuda, hi ha la possibilitat de fer consultes connectant amb bases de dades XML locals o remotes, etc.

Bases de dades XML

Lògicament, com que les bases de dades natives fan servir XQuery com a base en les seves consultes, resulten ideals per provar expressions XQuery.

És corrent que aquestes tinguin alguna consola o un entorn en el qual es podran executar les ordres i veure’n el resultat.

Consultes XQuery

Generalment una consulta XQuery consistirà a aconseguir les dades amb les quals es vol treballar, filtrar-les i retornar el resultat com a XML. L’expressió més simple que es pot fer en XQuery és escriure un element buit:

<Hola />

En executar aquesta ordre el resultat serà el següent:

  1. <?xml version="1.0" ?>
  2. <Hola/>

Aquesta és una de les característiques importants d’XQuery: que escriu literalment el text; mentre que si en el resultat s’hi defineixen etiquetes l’expressió només serà correcta si el resultat final és ben format. Per exemple, executar el següent en XQuery donarà un error, ja que el resultat final no és ben format:

  1. <a>

Però a pesar de poder escriure text, el més corrent és recuperar algun tipus de dades, avaluar-les i retornar el resultat amb un return. La instrucció return s’encarrega de generar les sortides.

Una altra característica important és que fa servir variables. Per exemple la següent és una expressió XQuery correcta que assigna el valor 5 a $a i després en retorna el valor:

let $a:=5
return 5

El resultat d’executar-ho amb XQuery serà:

  1. <?xml version="1.0" ?>
  2. 5

A diferència del que passa amb els literals, el return s’executa una vegada per cada valor que rebi, de manera que si hi hagués una expressió que es fes més d’un cop:

for $a in (1,2)
return <Hola/>

El return s’executaria més d’un cop:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Hola/>
  3. <Hola/>

Comentaris

Com en gairebé tots els llenguatges, en XQuery també es permeten els comentaris. Com que XQuery no té sintaxi XML els comentaris no es fan de la mateixa manera que en XML sinó que es defineix el seu sistema propi.

Els comentaris es defineixen posant-los entre el símbol ”(:” i el ”:)”.

(: Comentari :)

També es poden fer comentaris multilínia

(:
Això també
és un comentari
:)

Tot el que estigui dins d’un comentari serà ignorat pel processador.

Càrrega de documents

Una de les coses que caldrà per interrogar un fitxer o fitxers XML és establir específicament a quins documents es vol fer la petició. La càrrega dels fitxers la podem fer amb dues funcions que podem veure a la taula.

Taula: Funcions per carregar fitxers XML
Funció Ús
doc() Dir quin és el document que volem consultar.
collection() Especificar un grup de documents alhora. Generalment serà un document amb enllaços a d’altres o una adreça d’una base de dades XML.

Per tant, podem fer servir la funció doc() per carregar un document XML. Amb aquesta instrucció XQuery tornarà tot el document alumnes.xml.

return doc("alumnes.xml")

XQuery conté completament XPath, de manera que es pot fer servir qualsevol expressió XPath per filtrar resultats quan faci falta, i per tant es pot fer que en en el mateix procés de càrrega s’hi apliqui un filtre. Per exemple una expressió XQuery que retorna quins són els noms dels alumnes del fitxer alumnes.xml pot ser la següent:

return doc("alumnes.xml")//nom

Els documents poden estar en qualsevol lloc al qual es pugui arribar. En aquest cas, per exemple, l’expressió XQuery pot ser una URL:

return doc("http://ioc.xtec.cat/alumnes.xml")

Variables

XQuery és un llenguatge pensat per fer cerca en documents XML, però no solament es pot fer servir per fer cerca, ja que té suport per fer operacions aritmètiques i per treballar amb cadenes de caràcters.

En aquest exemple fem servir XQuery per fer una operació matemàtica senzilla:

let $x := 5
let $y := 4
return $x + $y

El resultat serà:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. 9

Una característica d’XQuery que el diferencia d’altres llenguatges de cerca és que disposa de variables:

  • Les variables en XQuery s’identifiquen perquè comencen sempre amb el símbol $.
  • Poden contenir qualsevol valor: literals numèrics o caràcters, seqüències de nodes…
  • La instrucció per assignar valors a una variable és let.

Un dels usos fonamentals de les variables és emmagatzemar elements per poder-los fer servir posteriorment. En l’exemple següent s’emmagatzemen els elements <nom> en la variable $alumnes i després en retorna la quantitat d’alumnes:

let $alumnes := doc("alumnes.xml")//alumnes/nom
return count($alumnes)

Es poden aplicar filtres XPath a les variables:

let $tot := doc("classe1.xml")
let $profe := $tot//professor
let $alum := $tot//alumne

Els valors de les variables els podrem comparar amb els operadors de comparació habituals que podem veure a la taula.

Taula: Operadors de comparació
Operador Operador2 Ús
= eq Dos valors són iguals
!= ne Dos valors són diferents
> gt És més gran que l’altre
>= ge És més gran o igual
< lt Més petit
le Més petit o igual

Els operadors eq, ne, gt, ge, lt i le només es poden fer servir per comparar valors individuals, i per tant només es podran fer servir si hi ha un esquema definit.

Expressions avaluables

XQuery està pensat per poder mesclar les consultes amb qualsevol altre tipus de contingut. Si es mescla amb contingut, les expressions que s’hagin d’avaluar s’han de col·locar entre claus ”{…}”.

Per exemple, podem mesclar HTML i XQuery per tal que el processador XQuery generi una pàgina web amb les dades d’un document XML.

  1. <head><title>Llista de classe</title></head>
  2. <body>
  3. <h1>
  4. {
  5. doc("classe1.xml")//assignatura
  6. }
  7. </h1>
  8. </body>
  9. </html>

En mesclar contingut, el processador XQuery només avaluarà les instruccions que estiguin dins de les claus, i per tant deixarà les etiquetes HTML tal com estan.

Creació d'elements i atributs

Fent servir les expressions avaluables és fàcil crear nous elements.

<modul>
  { doc("classes.xml")//modul/text()} 
</modul>

També es poden crear atributs (s’ha d’anar en compte de no deixar-se les cometes al voltant del valor que obtindran els atributs).

<modul nom="{doc("classes.xml")//modul/text()}"/>

Una manera alternativa i més potent de definir elements i atributs és fer servir les paraules clau element i attribute. Aquestes instruccions permeten crear elements i definir-ne el contingut especificant-lo dins de les claus.

element modul {
}

Crearia un element <modul> buit:

  1. <modul />

Si volem crear nous elements o atributs dins d’un element definit d’aquesta manera s’han d’especificar dins de les claus. Per exemple, el codi següent:

element modul {
    attribute nom {"Llenguatges de marques"},
    element alumnes { }
}

Generarà el següent:

  1. <modul nom="Llenguatges de marques">
  2. <alumnes />
  3. </modul>

No hi ha cap limitació a l’hora d’imbricar els elements i atributs per generar resultats tan complexos com calgui, i en qualsevol moment s’hi pot posar una expressió XQuery.

element modul {
   attribute nom { doc("classe.xml")//modul/text() }
}

Expressions FLWOR

Les expressions FLWOR són la part més potent d’XQuery. Estan formades per cinc instruccions opcionals que permeten fer les consultes i alhora processar-les per seleccionar els ítems que interessin d’una seqüència (taula).

Taula: Expressions FLWOR
Caràcter Comanda Ús
f for Permet passar d’un element a un altre de la seqüència
l let Serveix per assignar valors a una variable
w where Permet filtrar els resultats segons condicions
o order by Usat per ordenar els resultats abans de mostrar-los
r return Retorna el resultat de tota l’expressió

"for ... return"

La instrucció for es fa servir per avaluar individualment cada un dels resultats d’una seqüència de nodes. En un for es defineixen dues coses:

  • Una variable, que serà la que anirà agafant els resultats de la seqüència un per un.
  • La paraula clau in, en la qual es defineix quina és la seqüència d’elements per processar.

La manera més senzilla d’expressió FLWOR és combinar el for amb el return per retornar els valors obtinguts de manera seqüencial:

for $i in ('Hola', 'Adéu')
return $i

Generarà:

Hola Adéu

Les seqüències de valors poden ser de qualsevol tipus. Per exemple, poden ser nombres:

for $i in (1,2,3)
return $i*$i

Que retorna:

1 4 9

O bé una seqüència de nodes. Per exemple amb l’expressió següent capturem una seqüència de nodes <alumne> i els fem servir per obtenir-ne el cognom:

for $alumne in doc("classe.xml")//alumne
return <alumne> { $alumne/cognom } </alumne>

El resultat serà quelcom així:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <alumne>
  3. <cognom>Pi</cognom>
  4. </alumne>
  5. <alumne>
  6. <cognom>Garcia</cognom>
  7. </alumne>

S’hi pot veure que els valors del return s’han anat processant un per un i per aquest motiu es repeteixen les etiquetes <alumne>.

Un aspecte important és que no cal que el for sigui la primera expressió de la consulta. També es pot posar com a paràmetre en una funció XPath.

Per exemple, l’expressió següent ens tornarà el nombre d’alumnes:

count (
 for $alumne in doc("alumnes.xml")//nom
 return $alumne
)
"for ... at"

En el for es pot incloure l’operador at, que permet obtenir la posició del node que s’està processant. Amb aquest operador es pot fer que surti el número d’ordre en els resultats.

for $alumne at $pos in doc("classe.xml")//alumne
return <alumne numero="{$pos}">
         { $alumne/cognom/text() }
       </alumne>

Que donarà:

<?xml version="1.0" encoding="UTF-8"?>
<alumne numero="1">Pi</alumne>
<alumne numero="2">Garcia</alumne>
<alumne numero="3">Puigdevall</alumne>
"for" amb múltiples variables

Fins ara només s’ha fet servir una variable en el for però se n’hi poden posar tantes com faci falta separant-les per comes:

<resultats>
{
for $tot in doc("classe.xml")/classe,
    $nom in $tot/alumnes,
    $modul in $tot/assignatura/text()
return
   <modul nom="{ $modul }"
          alumnes="{ count($nom/alumne)}">
         { $nom/alumne/nom }
   </modul>
}  
</resultats>

Que donarà el resultat següent:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <resultats>
  3. <modul alumnes="3" nom="Llenguatges de marques">
  4. <nom>Frederic</nom>
  5. <nom>Filomeno</nom>
  6. <nom>Manel</nom>
  7. </modul>
  8. </resultats>
"for" niuat

Imbricant les instruccions for entre elles es poden aconseguir el que SQL anomena outer joins. O sigui que es retonaran sempre tots els resultats de la primera consulta i, només en el cas que hi hagi alguna relació, s’uniran amb els de la segona consulta.

Les ordres for es poden imbricar entre elles d’una manera similar a com ho fa SQL per poder aconseguir resultats més complexos que es basin en els resultats obtinguts anteriorment.

for $selec in doc("classe.xml")//alumne
return 
<persona>
    { $selec/nom }
    {
        for $selec2 in $selec
        return $selec2//cognom
    }
</persona>

let

let permet declarar variables i assignar-los un valor. Sobretot es fa servir per emmagatzemar valors que s’han de fer servir més tard.

let $num := 1
let $nom := "manel"
let $i := (1 to 3)

En les expressions FLWOR hi pot haver tants let com calgui.

for $alumne in doc("notes.xml")//alumne
let $nom := $alumne/nom
let $nota := $alumne/nota
return <nom>concat($nom,":",$nota)

S’ha d’anar amb compte amb let perquè el seu funcionament és molt diferent del de for:

  • for s’executa per a cada membre d’una seqüència.
  • let fa referència al seu valor en conjunt. Si és una seqüència el que es processa són tots els valors de cop.

Podem veure la diferència amb un exemple. Aquesta instrucció amb for:

for $selec in doc("classes.xml")//alumne
return <persona>{$selec/nom}</persona>

Dóna:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persona><nom>Frederic</nom></persona>
  3. <persona><nom>Filomeno</nom></persona>
  4. <persona><nom>Manel</nom></persona>

I en canvi amb let:

let $selec := doc("classes.xml")//alumne
return <persona>{$selec/nom}</persona>

Donarà:

<?xml version="1.0" encoding="UTF-8"?>
<persona>
   <nom>Frederic</nom>
   <nom>Filomeno</nom>
   <nom>Manel</nom>
</persona>

Els resultats són bastant diferents! Es pot veure clarament que let ha tractat tots els valors de cop.

Condicions

La instrucció where és la part que indicarà quin filtre s’ha de posar a les dades rebudes abans d’enviar-les a la sortida del return. Normalment en el filtre es fa servir algun tipus de predicat XPath:

for $alumne in doc("classe.xml")//alumne
where $alumne/@aprovat="si"
return $alumne/nom

Com que XPath forma part d’XQuery moltes vegades el mateix filtre es pot definir de diverses maneres. Per exemple, aquesta expressió és equivalent a l’anterior:

for $alumne in doc("classe.xml")//alumne[@aprovat="si"]
return $alumne/nom

En un where hi pot haver tantes condicions com calgui simplement encadenant-les amb les operacions lògiques and, or o not().

Aquesta expressió retorna el cognom dels alumnes que han aprovat i que es diuen Pere:

for $alumne in doc("classe.xml")//alumne
where $alumne/@aprovat="si" and nom="Pere"
return $alumne/cognom

El where afegeix més potència del que sembla, ja que ens permet fer els inner joins d’SQL en fitxers XML. Per exemple, a partir de dos fitxers amb les dades de dues classes diferents es poden obtenir només els alumnes que es repeteixen entre les dues classes amb:

for $alum1 in doc("classe1.xml")//alumne
let $alum2 in doc("classe2.xml")//alumne
where $alum1 = $alum2
return $alum1
Quantificadors existencials

A vegades cal comprovar si algun o tots els elements d’una seqüència compleixen una determinada condició, i per això s’han definit les expressions quantificades. Amb les expressions quantificades es poden fer comprovacions sense haver de recórrer a comptadors (taula).

Quantificador Serveix per
every .. satisfies Comprovar que tots els elements compleixin una condició determinada.
some .. satisfies Comprovar que algun dels elements de la llista compleixin la condició.

A aquestes expressions els passem una variable que capturarà el valor concret respecte al qual es vol fer la comprovació. Per exemple, amb aquesta expressió només donarà el nom de la classe si tots els alumnes de la seqüència tenen de cognom Pi:

for $s in doc("classe.xml")//alumnes
where some $e in $s//cognom satisfies ($e="Pi")
return $s/modul

Canviant every per some retornarà el nom de la classe si algun dels alumnes es diu de cognom Pi”:

for $s in doc("classe.xml")//alumnes
where some $e in $s//cognom satisfies ($e="Pi")
return $s/modul

Aquestes expressions per si soles no serveixen per filtrar contingut, ja que sempre retornen cert o fals. Per aquest motiu sempre se solen fer servir dins d’una clàusula where.

Ordenació

Una de les operacions habituals en les cerques és representar els resultats en un ordre determinat. Aquesta és la funció que fa order by.

Es pot ordenar de manera ascendent amb ascending (que és el que fa per defecte) o bé descendent amb descending.

for $alumne in doc("classe.xml")//alumne
order by $alumne/cognom
return $alumne

També es poden especificar diferents conceptes en l’ordenació. En aquest exemple els resultats s’ordenaran primer per cognom i després per nom:

for $alumne in doc("classe.xml")//alumne
order by $alumne/cognom, $alumne/nom
return $alumne

En aquest altre el cognom s’ordena de manera descendent i el nom de manera ascendent.

for $alumne in doc("classe.xml")//alumne
order by $alumne/cognom descending, $alumne/nom ascending
return $alumne

Per defecte ordena com si el contingut de les etiquetes fos text. Si cal obtenir una ordenació numèrica caldrà convertir els valors a nombres amb la funció d’XPath number().

for $alumne in doc("classe.xml")//alumne
order by number($numero)
return $alumne

Alternatives

La instrucció if ens permetrà fer una cosa o una altra segons si es compleix la condició especificada o no. Per exemple, podem fer una llista d’alumnes en què s’especifiqui si han aprovat o no a partir del valor que hi ha en l’element <nota>.

let $doc := doc("classe1.xml")
let $aprovat := 5
for $b in $doc//alumne
return
if ($b/nota >= 5) then
<data>
{ $b/nom/text() } està aprovat 
</data>
else
<data>
{ $b/nom/text() } no està aprovat 
</data>

Això generarà el resultat següent:

  1. <data>Frederic està aprovat</data>
  2. <data>Filomeno no està aprovat</data>
  3. <data>Manel està aprovat</data>

La instrucció else és habitual en llenguatges de programació, però a diferència del que passa normalment, en XQuery, encara que no es vulgui fer res, en cas que la condició falli s’hi ha d’especificar l’else. Si no es vol que faci res es deixa en blanc.

for $classe in doc("classe1.xml")//alumne
return  if ($classe/nota > 5) then 
         <aprovat/>
        else ()

El pròleg XQuery

A pesar que en moltes expressions XQuery no s’especifica cap pròleg, les expressions XQuery estan formades per dues parts:

  • Pròleg: és una part opcional i serveix per donar informació al processador per saber com s’ha d’avaluar l’expressió. Exemples típics són declarar espais de noms, variables o funcions, importar esquemes, o definir com s’han de tractar els espais en blanc.
  • Cos: és on hi ha el que es vol fer amb l’expressió.

Un valor que se sol especificar en el pròleg és la versió d’XQuery que s’ha de fer servir en la consulta. És opcional, però si s’hi posa ha de ser la primera línia del fitxer.

xquery version "1.0";

També s’hi poden definir altres coses com informació sobre la consulta o dades que posteriorment es podran fer servir en el cos de l’expressió.

En aquest exemple, en la capçalera es passa informació al processador sobre com ha de tractar els espais, s’hi declara una variable $alum que contindrà una part del document XML i es defineix un espai de noms ioc. Les variables i l’espai de noms es poden fer servir en l’expressió.

xquery version "1.0";
declare boundary-space preserve;
declare namespace ioc="http://ioc.xtec.cat/alum";
declare variable $alum := doc("alumnes.xml")//alumne;

<ioc:llista>
{
   for $nom in $alum/nom
   return <alumne>{$nom}</alumne>
}
</ioc:llista>

En executar la consulta el processador afegirà automàticament l’espai de noms al resultat de l’expressió en la definició de <llista>:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ioc:llista xmlns:ioc="http://ioc.xtec.cat/alum">
  3. <ioc:alumne>
  4. <nom>Frederic</nom>
  5. </ioc:alumne>
  6. <ioc:alumne>
  7. <nom>Filomeno</nom>
  8. </ioc:alumne>
  9. <ioc:alumne>
  10. <nom>Manel</nom>
  11. </ioc:alumne>
  12. </ioc:llista>

Un dels usos interessants del pròleg és que permet passar paràmetres a les expressions. Si es declara una variable com external, per poder executar la consulta s’haurà de proporcionar un valor a la variable:

declare variable $entrada as xs:string external;

<resultat>
{ $entrada }
</resultat>

Per executar la consulta anterior amb la utilitat Query de Saxon s’haurà d’especificar el valor de la variable entrada de la manera següent:

C:\> Query prova.xquery entrada=Hola
<?xml version="1.0" encoding="UTF-8"?><resultat>Hola</resultat>

Un altre ús interessant del pròleg és que permet definir funcions:

declare function quadrat($numero as xs:integer) return xs:integer
{
   return ($numero*$numero)
};

Aquestes es poden cridar de la mateixa manera que les funcions normals d’XPath:

quadrat($alumne/nota)

Actualitzacions de dades

Un llenguatge que pretengui ser un estàndard de consulta ha de poder gestionar completament les dades, i per tant necessita alguna manera de fer consultes però també canviar, afegir o esborrar dades. XQuery 1.0 és bàsicament un llenguatge de consultes, i tot i que la majoria de les operacions que es fan en els sistemes de base de dades són consultes, necessita alguna manera de poder actualitzar les dades.

Per aquest motiu en el W3C s’ha posat en marxa la creació d’un sistema d’actualitzacions anomenat xqupdate (XQuery Update Facility 1.0), que ha de permetre a XQuery fer les actualitzacions. Alhora també hi ha altres iniciatives per crear un estàndard per actualitzar valors en sistemes XML com el que promociona el grup XMLDB, que s’anomena XUpdate (XML update language).

La falta d’existència d’un estàndard clar fa que els programes que implementen XQuery, si volen oferir la possibilitat de fer actualitzacions, no sempre tinguin clar quin sistema d’actualitzacions han de fer servir i es decantin pel que els agrada més, per incloure’n diversos o fins i tot per crear el seu propi sistema.

Fer servir XQuery per respondre preguntes sobre documents XML

Partint d’aquest XML d’exemple que representa comandes de llibres:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <petició llibreria="Fantastica SL">
  3. <data>15-11-2011</data>
  4. <autor>
  5. <nom>Frédérik McCloud</nom>
  6. <llibres>
  7. <llibre>
  8. <titol>Les empentes</titol>
  9. <quantitat>2</quantitat>
  10. </llibre>
  11. </llibres>
  12. </autor>
  13. <autor>
  14. <nom>Corsaro Levy</nom>
  15. <llibres>
  16. <llibre>
  17. <titol>Marxant de la font del gat</titol>
  18. <quantitat>2</quantitat>
  19. </llibre>
  20. <llibre>
  21. <titol>Bèstia!</titol>
  22. <quantitat>2</quantitat>
  23. </llibre>
  24. </llibres>
  25. </autor>
  26. <autor>
  27. <nom>Marc Blairet</nom>
  28. <llibres>
  29. <llibre>
  30. <titol>Tres de tres</titol>
  31. <quantitat>3</quantitat>
  32. </llibre>
  33. </llibres>
  34. </autor>
  35. </petició>

Es vol respondre la pregunta següent: de quins autors s’han demanat tres o més llibres?

Per respondre aquesta pregunta el primer que cal és separar el document en blocs d’autor i processar-ne cada un de manera diferent. Per tant, es defineix un bucle amb un for per cada autor i s’escriu el nom per pantalla

for $autor in doc("llibres.xml")//autor
return $autor/nom

Si es passa l’expressió per un processador XQuery el resultat serà una llista de tots els autors:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <nom>Frédérik McCloud</nom>
  3. <nom>Corsaro Levy</nom>
  4. <nom>Marc Blairet</nom>

Es vol definir una restricció amb la quantitat de llibres que s’han demanat de cada autor; per tant, ho podríem intentar fer amb el where

for $autor in doc("llibres.xml")//autor
where $autor/llibres/llibre/quantitat >= 3
return $autor/nom

Aquesta és la llista dels autors que tenen alguna petició de 3 o més llibres

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <nom>Marc Blairet</nom>

Però es pot veure que encara no és el demanat, ja que no surt l’autor Corsaro Levy, del qual s’han demanat dues unitats llibres diferents. Per tant, agrupem les quantitats per obtenir el resultat correcte

  1. for $autor in doc("llibres.xml")//autor
  2. where sum($autor/llibres/llibre/quantitat) >= 3
  3. return $autor/nom

Ara el resultat sí que és el correcte:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <nom>Corsaro Levy</nom>
  3. <nom>Marc Blairet</nom>

Podem fer que el resultat sigui més “bonic” mostrant les quantitats venudes al costat de cada autor i ordenant de més a menys els resultats.

for $autor in doc("llibres.xml")//autor 
let $suma := sum($autor/llibres/llibre/quantitat)
where $suma >=3
order by $suma descending
return concat($autor/nom," : ", $suma)

Es pot veure que per no haver d’escriure diverses vegades l’expressió de suma s’ha definit una variable $suma i d’aquesta manera l’expressió ha quedat més fàcil d’escriure

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. Corsaro Levy : 4
  3. Marc Blairet : 3

La funció concat() ha eliminat les etiquetes XML i ha generat un resultat de text. Si es volgués mantenir una estructura XML es pot crear manualment amb l’ajuda de les expressions avaluables:

for $autor in doc("llibres.xml")//autor 
let $suma := sum($autor/llibres/llibre/quantitat)
where $suma >=3
order by $suma descending
return <autor> { concat($autor/nom," : ", $suma) } </autor>

Que generarà:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <autor>Corsaro Levy : 4</autor>
  3. <autor>Marc Blairet : 3</autor>

Bases de dades natives XML

Si no entrem en detalls tècnics, la definició d’una base de dades és un lloc en el qual es poden emmagatzemar dades. En el cas d’una base de dades en XML, consistiria simplement en emmagatzemar els fitxers XML en un punt concret del sistema operatiu.

L’increment de documents XML a emmagatzemar ha fet que, malgrat que l’emmagatzematge es pugui fer manualment, sigui interessant disposar d’alguna manera d’automatitzar el procés. Per facilitar aquesta automatització han aparegut les bases de dades natives XML (NXD).

Quan es parla de bases de dades natives XML es fa referència a bases de dades dissenyades per contenir i emmagatzemar dades en format XML.

A diferència del que passa amb les bases de dades relacionals, que fa molts anys que funcionen i tenen darrere seu una base teòrica important, les NXD no tenen uns estàndards definits per fer les coses i la teoria que les suporta no està gaire definida. Això fa que sovint cada base de dades faci les coses d’una manera que pot ser totalment diferent de com ho fa una altra.

Les bases de dades natives XML es fan servir sobretot per emmagatzemar dades que contenen:

  • Contingut narratiu.
  • Que són menys previsibles que les que s’emmagatzemen normalment en bases de dades relacionals.
  • Que han de generar sortides per a entorns web.
  • Que s’han de transportar d’un sistema a un altre.

Característiques més importants

Els sistemes NXD són molt heterogenis i sovint s’estan desenvolupant en direccions que no sempre coincideixen. Tot i la dispersió, sempre podem trobar punts en comú en la majoria de les bases de dades.

Llenguatge de consulta

Tots els sistemes NXD suporten com a mínim XPath com a llenguatge de consultes, tot i que la tendència general és adoptar XQuery; és lògic si es té en compte que XPath no va ser pensat per ser un llenguatge de consulta de base de dades, mentre que XQuery sí.

Tots els sistemes suporten algun tipus d’interfície que permet accedir-hi per mitjà d’algun llenguatge de programació, com ara la interfície XML:DB, o bé per mitjà d’algun protocol de xarxa com HTTP, WebDAV, SOAP…

Organització i emmagatzematge

L’organització més habitual de les dades és mitjançant col·leccions de documents XML que sovint intenten generar una estructura semblant a la que ofereixen els directoris dels sistemes operatius. En aquests sistemes una col·lecció és com una carpeta que conté un conjunt de documents XML o fins i tot altres carpetes (figura).

Figura Les col·leccions en eXist són carpetes que contenen fitxers

El tractament de les col·leccions sol ser una de les diferències que hi ha entre bases de dades XML. Algunes forcen que dins d’una col·lecció hi hagi documents del mateix tipus, mentre que altres permeten que s’hi posi qualsevol tipus de document.

L’emmagatzematge de les dades sol ser el que diferencia més les NXD, ja que la naturalesa dels fitxers XML no els fa ideals per ser emmagatzemats de manera eficient (tenen repeticions, ocupen molt d’espai…). Per aquest motiu totes les NXD intenten optimitzar d’alguna manera aquest emmagatzematge: convertint les dades en fitxers binaris (amb simples compressions de dades o codificant-les), creant estructures d’arbre, o simplement emmagatzemant els fitxers XML sense fer-hi res confiant que la reducció de costos de l’emmagatzematge farà que ocupar espai no sigui un problema.

Indexació

A l’hora de fer servir una base de dades el que importa realment a l’usuari és que faci la cerca en un temps acceptable. Els fitxers de text no són la millor manera d’emmagatzemar dades si l’objectiu és fer-hi cerques, i per tant les bases de dades XML s’han esforçat a intentar crear algun sistema per fer aquestes cerques més eficients.

El més habitual sol ser:

  • Organitzar de manera eficient les col·leccions
  • Fer servir índexos

Si som prou organitzats a l’hora de desar els documents XML podria ser que ni ens fes falta tenir una base de dades XML.

Com passa en el món real, pot ser més senzill trobar el que busquem si tenim les dades ben organitzades i ben classificades que si les tenim de manera caòtica. Per tal per buscar les dades només caldrà accedir a la col·lecció adequada i des d’allà fer la cerca.

Un altre punt de vista consisteix a indexar les dades d’alguna manera per poder aconseguir recórrer la informació en un ordre determinat que permeti accedir a les dades d’una manera més ràpida. A diferència del que passa amb les bases de dades relacionals, en les d’XML no hi ha desenvolupades gaire teories sobre com s’han de crear els índexs, i això fa que els diferents productes facin servir filosofies d’indexació totalment diferents.

A pesar d’això el mètode d’indexació més corrent és crear una estructura d’arbre paral·lela als documents XML que contingui les dades que cal que siguin indexades.

Seguretat

La seguretat és un altre aspecte per tenir en compte en els sistemes NXD. Generalment en un entorn empresarial no tothom pot accedir a les dades que vulgui sinó que a la informació poden accedir només les persones autoritzades (figura).

Figura eXist demana autorització per permetre la connexió

La identificació d’usuaris permet implementar els mecanismes bàsics per permetre controlar a quins documents pot accedir cada un dels usuaris de l’organització (figura).

Figura Permisos de fitxers

Actualitzacions de les dades XML

La falta d’un sistema d’actualitzacions dels fitxers XML en la primera versió d’XQuery ha fet que molt sovint els sistemes NXD, en comptes d’actualitzar les dades que han canviat, optin per substituir totalment el document cada vegada que s’hi produeixin canvis.

Per aquest motiu se solen oferir sistemes de transferència de fitxers via HTTP com WebDAV (figura) (Web-based distributed authoring and versioning) o per mitjà de serveis web (SOAP o REST).

Figura Connexió amb eXist per mitjà de WebDAV

A pesar d’això la tendència és que els sistemes s’acullin a alguna de les propostes d’estàndards d’actualització de dades XML com xqupdate o XML:DB XUpdate.

Exemples de bases de dades natives XML

Hi ha moltes bases de dades XML que s’estan fent servir actualment en entorns professionals:

  • Tamino: permet tenir un sistema híbrid d’emmmagatzematge XML i relacional.
  • eXist-db: es tracta d’un sistema de codi obert que fa servir una indexació de dades amb BTree en fitxers dividits en pàgines.
  • TigerLogic XDMS: es pot fer servir tant per emmagatzemar documents XML com dades multimèdia.
  • EMC xdb: una base de dades per a documents XML molt escalable.
  • Apache XIndice: es tracta d’un sistema pensat per emmagatzemar grans col·leccions de petits fitxers XML. És de codi obert.
  • MarkLogic: ofereix una solució empresarial per emmagatzemar qualsevol tipus de documents, metadades, RSS, correus electrònics, XML…

Generalment totes ofereixen:

  • Emmagatzematge eficient de documents XML
  • Suport per a consultes XQuery o XPath
  • Alguna forma orientada a recursos d’accés a les dades: HTTP, webDAV, serveis web…
  • Transformació de documents
  • Diverses interfícies d’usuari

eXist-db

De les bases de dades XML de codi obert disponibles, probablement eXist-db és la que està més preparada per ser usada en un entorn professional. Es tracta d’una base de dades nativa XML que està desenvolupada en llenguatge Java, i que:

  • Permet fer operacions amb els llenguatges XQuery 1.0, XPath 2.0 i XSLT 2.0.
  • Pot funcionar tan com una biblioteca que s’incorpora als programes com ser executada per mitjà d’un servidor.
  • Es pot accedir a la base de dades per mitjà de múltiples interfícies estàndards com REST, WebDAV, SOAP, XML-RPC o ATOM.
  • Permet actualitzacions de dades per mitjà de l’API XMLDB, XUpdate i XQuery Update Facility.
  • Porta incorporat un sistema de gestió d’usuaris de la base de dades i dels permisos d’accés a les col·leccions semblant al dels sistemes Unix (figura).
Figura Cada fitxer té permisos d’usuari i de grup

L’organització de les dades és per mitjà de col·leccions de fitxers XML que s’organitzen d’una manera pràcticament idèntica a com es fa en els fitxers d’un sistema operatiu. Igual que en els sistemes operatius, es poden fer col·leccions dins de col·leccions i s’hi pot navegar amb un sol clic (figura).

Figura L’organització es fa en col·leccions i són navegables

Instal·lació

La instal·lació es fa per mitjà d’un senzill sistema d’instal·lació basat en finestres (figura).

Figura Instal·lació d’eXist

En la instal·lació per defecte a més de l’eXist s’hi instal·la el servidor Jetty, que permetrà accedir a la gestió web del sistema amb un navegador en l’adreça http://localhost:8080/exist/.

Si es fa servir el servidor, l’accés a les consultes i l’administració del sistema es pot fer per mitjà d’un client Java que proporciona, o bé per mitjà de l’entorn web (figura).

Figura Client Java per connectar amb la base de dades

Tant el client com el client web disposen d’un entorn per poder elaborar consultes XQuery (figura).

Figura Consultes Xquery des del client

Treballar interactivament amb l'eXist

Abans de poder començar a treballar amb l’eXist cal que s’hagin entrat les dades en la base de dades. En aquest exemple ens concentrarem en com es pot fer des de l’entorn web però es pot fer d’una manera semblant des del programa client.

Crear una col·lecció

Amb l’eXist en marxa, des de la mateixa màquina on s’ha instal·lat l’eXist obriu un navegador i aneu a l’adreça http://localhost:8080/exist/ (figurafigura).

Figura Pàgina inicial de l’eXist

En la part inferior de la columna de l’esquerra hi ha un enllaç dins de la secció “Administration” que es diu “Admin” (figura).

Figura

En clicar-hi us portarà a una finestra on es demana la identificació de l’usuari. El primer cop que s’hi accedeix no hi ha usuaris, i per tant caldrà entrar amb l’usuari admin i la contrasenya especificada en la instal·lació (figura).

Figura
Figura Pantalla d’administració de l’eXist

Un cop esteu identificats, entreu en la zona d’administració; al costat esquerre hi ha un menú que permet fer diverses coses, com navegar per les col·leccions i els índexs, aturar el servidor, instal·lar els fitxers d’exemple, crear usuaris… (figura).

Per crear una col·lecció nova cal anar al menú de l’esquerra i clicar en l’opció “Browse collections”. Això farà que aparegui tota la llista de les col·leccions instal·lades en el sistema. Per crear una nova col·lecció anomenada classes, cal que escrigueu el nom en el quadre de text i premeu el botó (figura).

Figura Fer una llista de les col·leccions

En entrar-hi la col·lecció no té cap fitxer XML: els podeu afegir amb l’ajuda del botó “Upload”; i ja tindreu la col·lecció creada (figura).

Figura Creada la col·lecció classes
Fer consultes XQuery

Les consultes XQuery també es poden fer des de qualsevol dels entorns que proporciona l’eXist-db. Per fer-ho des de l’entorn web cal anar a la pàgina principal i en el menú de l’esquerra, dins de l’opció “Example”, escollir l’opció “XQuery SandBox”.

Aquesta opció us portarà a una pàgina en la qual es poden fer consultes XQuery de les col·leccions o els fitxers XML que hi ha en el sistema (figura).

Figura XQuery SandBox

A partir de la versió 1.5 s’ha afegit l’opció “XQuery IDE (eXide)”, que és un sistema molt més potent que ofereix tota una sèrie d’avantatges afegits: comprova interactivament els errors, permet autoemplenar en temps de disseny, etc. (figura).

Figura eXide

Sigui quina sigui l’opció triada, en la finestra superior sortirà un espai destinat a escriure la consulta que es vol fer en XQuery (o XPath), i en la part inferior es podran veure els resultats.

Per exemple, per fer una consulta que retorni el nom dels alumnes de dins de la col·lecció “classes”, podem escriure una expressió XQuery com la següent:

for $alumne in collection("/db/classes")//alumne/nom
return $alumne/text()

Que donarà el que es veu en la figura.

Figura Noms dels alumnes de la col·lecció
Anar a la pàgina anterior:
Exercicis d'autoavaluació
Anar a la pàgina següent:
Activitats