Вы находитесь на странице: 1из 15

UTILIZACIN DE XML PARA EL ALMACENAMIENTO

DE INFORMACIN.

Utilizacin de XML para el almacenamiento de la informacin.


Como sabis, gran parte de las Bases de Datos de hoy en da estn basadas en el modelo Entidad-
Relacin. Este modelo ha funcionado bien durante mucho tiempo y todava lo seguir haciendo.
Tras la llegada de internet la comparticin de la informacin empez a resultar crucial para no
quedarse desfasado y mejorar las condiciones comerciales. Por ejemplo, la empresa X necessita
enviarle a la empresa Y informacin en relacin a sus transacciones comerciales. El envo de la
informacin beneficia a X y a Y (reduccin de tiempo, dinero, costes burocrticos,...). Es lo que se
denomina B2B (Bussines To Bussines). El problema es que X utiliza unos modelos de datos
distintos a los de Y. Tampoco es fcil ponerse deacuerdo con el SGBD. Debe haber algo que permita
a ambos sistemas comunicarse entre s, siendo distintos. La solucin...XML

XML permite definir de manera rpida e intuitiva una representacin de la informacin que ambas
empresas desean compartir. La empresa X usar su SGBD para exportar sus datos a XML y se los
remitir a Y. Ambas empresas conocen esa representacin de la informacin por lo que la
informacin fluir sin problema, independientemente de los campos de las tablas de las BD o del
SGBD.

Los SGBD actuales, proporcionan en algunos casos extensiones que permiten trabajar con los
modelos y representaciones definidas en documentos XML. Nuestro objetivo es usar desde el
principio XML, analizando BD XML nativas como:
eXcelon XIS Lite. http://xml.coverpages.org/ExcelonXIS-Lite.html
TEXTML. http://www.ixiasoft.com
dbXML. http://sourceforge.net/projects/dbxml-core
eXist. http://exist.sourceforge.net

Las dos primeras son comerciales y las dos ltimas de OpenSource. Cuando hablamos de BD XML
nativas, hemos de dejar claro que existen 2 formas de almacenar informacin en ellas:

Usando un modelo centrado en el almacenamiento de los datos: exactamente igual que las
BD relacionales.
Usando un modelo centrado en el documento: no hay campos, ni datos, tal y como se conoce
en las BD Relacionales. Se guardan documentos XML.
La primera permite seguir utilizando los modelos relacionales dentro de BD XML. La segunda
permite almacenar documentacin de diferentes modelos dentro de la BD. Dependiendo de los
objetevos de almacenamiento que se planteen quizs se ajuste ms un modelo que otro.

Dado que el modelo ms usado hoy dia es el relacional, se indicarn una serie de pasos para que
usando XML se pueda utilizar el mismo modelo de datos.

Ms informacin: www.di.uniovi.es/~labra/cursos/ver06/pres/XMLBD.pdf

1
Bases de datos relacionales.

Imaginemos que queremos representar un conjunto de libros de una biblioteca. Para conseguir
almacenar toda la informacin relativa a cada libro necesitareos una taibla que almacene atributos
como Titulo, Autor, Editorial, Edicin, ISBN y Num Pginas. Esta tabla se llamara
Libros. Si se quiere aadir un libro, se generar una nueva entrada en la tabla, en la que se
completarn los atributos de ese libro. Si se quisiera aadir un segundo libro a almacenar, se
aadira otra tupla a la tabla. Y as sucesivamente.

COD TITULO AUTOR EDITORIA EDICIN ISBN NumPaginas


L
1 Don Quijote Miguel de Juan de la 3 9788466745 176
de la Cervantes Cuesta 840
Mancha
2 La Celestina Fernando Maxtor 1 9788471664 320
Rojas 938
3 Leyendas Gustavo Ctedra 21 9788437620 416
Adolfo 244
Bquer

Antes de seguir, podemos observar cmo existen atributos que podran ser compartidos por muchos
libros, como por ejemplo AUTOR. Un autor o una editorial podra ser comn en muchos libros. Si
de cada libro tuviramos que rellenar esa informacin completamente, la tabla tendra demasiada
informacin redundante. As que toda esa informacin debera salir de la tabla Libros y ubicarse en
una nueva tabla. Para el caso de Autor, podramos tener la tabla AUTORES con las siguientes
columnas: CodigoAutor, Nombre, Apellidos, FechaNacimiento.... El cdigo autor lo utilizaremos
para hacer referencia a un autor desde la tabla Libros.

TABLA AUTORES:

CodigoAutor Nombre Apellidos FechaNacimiento


1 Miguel De Cervantes 29-09-1547
2 Fernando De Rojas 01-01-1470
3 Gustavo Adolfo Becquer 17-02-1836

TRANSFORMACIN A XML
En principio la adaptacin de datos de una BD ralacional a XML es relativamente sencillo de
realizar. Una vez obtenido el modelo relacional, como el explicado anteriormente, se podra realizar
una transformacin de tablas a un documento XML simplemente creando una DTD y creando un
documento XML bien formado. A continuacin se detallan los pasos a realizar para una tabla de
libros y autores como la anterior:
1. Cada tabla del modelo relacional ser un elemento dentro de la DTD:
<!DOCTYPE Libros [
<!ELEMENT Libros(libro)*>

2
]>
2. Cada tupla de la tabla se llama libro. Es necesario indicar que campos de la tupla son
necesarios.<!ELEMENT
<!ELEMENT libro (Cod_Libro, Titulo, Autores, Editorial, Edicion, ISBN, NumPaginas)>
3. Cada columna de la tabla deber establecerse como un tipo de dato almacenable (char,
integer, ).
<!ELEMENT Cod_Libro (#PCDATA)>
<!ELEMENT Titulo (#PCDATA)>
<!ELEMENT Editorial (#PCDATA)>
<!ELEMENT Edicion (#PCDATA)>
<!ELEMENT isbn (#PCDATA)>
<!ELEMENT NumPaginas (#PCDATA)>
4. Si existe una columna compleja (como la de Autores), se debe crear un nuevo elemento
similar al del paso 2. En este caso un libro puede tener uno o ms autores. Tambin se
definir los tipos de datos a almacenar.

<!ELEMENT Autores (autor)+>


<!ELEMENT autor (cod_autor, nombre, apellidos, fechanacimiento)>
<!ELEMENT cod_autor (#PCDATA)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT fechanacimiento (#PCDATA)>
]>
Un ejemplo para un documento XML sera:

3
Lenguajes de consulta y manipulacin.

Como bien conocis, cuando instalamos un SGBD, los usuarios se comunicarn con l mediante
algn tipo de lenguaje que permita manipular los datos almacenados. Este lenguaje es SQL
(Structure Query Language).
Este lenguaje, en la actualidad, se considera el estndar pues la mayora de los SGBD lo
implementan. Cabe destacar lo siguiente (en lo relativo a XML):
El estndar SQL de 2003 establece ciertas caractersticas que permiten un soporte inicial a
documentos XML.
El estndar SQL de 2006 establece una mayor integracin con los documentos XML,
permitiendo importar y exportar datos en XML. Se establece XQuery como lenguaje de
consulta para colecciones de datos en formato XML (y tambin SQL) aprobado por el
W3C.
En definitiva, si usamos XML como lenguaje para almacenar informacin mediante un modelo
relacional, es necesario utilizar el lenguaje XQuery para manipular y extraer informacin.
XQuery es por lo tanto un lenguaje similar a SQL que permite recorrer los documentos XML de
manera que se pueda extraer y manipular la informacin contenida en el mismo. Es un lenguaje
muy sencillo que no requiere conocimientos de programacin avanzada. Adems XQuery es
compatible con la mayora de tecnologas estandarizadas por W3C.
Cuando se analiza un documento XML se crea un rbol de nodos del mismo. Este rbol tiene un
elemento raz y una serie de hijos. Los hijos del nodo raz pueden tener mas hijos. Repetimos este
proceso hasta que se llegue a un nodo que no tiene ningn hijo, este sera un nodo hoja.
Una vez creado el rbol, ste se recorre buscando la informacin que se necesita. Los nodos que nos
podemos encontrar por el camino son:
Nodo raz o /: es el primer nodo del documento XML.
Nodo elemento: cualquier elemento de un documento XML. El nodo raz es un caso
especial de nodo elemento ya que no tiene padre. Cada nodo elemento contiene un padre y
puede o no poseer nodos hijo. En el caso de que no tenga hijo se le denomina nodo hoja.
Nodo texto: cualquier elemento del documento que no est marcado con una etiqueta del
DTD del documento XML.
Nodo atributo: un nodo elemento puede tener etiquetas que complementen la informacin
de ese elemento. Eso sera un nodo atributo.
La extraccin de la informacin durante el recorrido del rbol ser tan simple como la deteccin de
los nodos a buscar y el procesamiento de la informacin que se quiere extraer de ese nodo en
concreto. Esto se realiza con la tecnologa denominada Xpath.
Xpath es la herramineta que usa XQuery para procesar el rbol de nodos de un documento XML.
Funciona a base de expresiones que permiten identificar qu parte del documento XML se quiere
acceder o recorrer. XPath tambin nos sirve para otras tecnologas como: Xpointer, XLink o XSLT
(como hemos visto anteriormente).

4
Vamos a ver como se realizan consultas usando XQuery.

XQuery
Seguiremos el ejemplo que estamos realizando durante todo el captulo, y haremos una serie de
consultas sobre l. Utilizaremos como base de datos nuestro documento libros.xml (o usando el
nombre que le hayis puesto).
En primer lugar creamos un nuevo documento XQuery (con extensin .xquery). Despus, una vez
creado el documento, vamos a utilizar una funcin XQuery llamada
doc(<nombre_del_documento.xml>) el cual permite extraer datos del documento indicado. Si
escribimos en nuestro documento:
doc(libros.xml)
equivaldra a hacer una consulta sin parmetros. Para probarlo: Debbuger>Run. A la derecha
aparecer el resultado de la operacin.

Si en vez de devolver todo el documento se quiere acceder solamente a un conjunto de nodos bien
identificados, aadiramos el camino en el rbol para acceder a ellos, por ejemplo, para acceder a
los libros:
doc(libros.xml)//Libros/libro

5
Como se puede ver, aparecen todos los libros que haba almacenados en el documento XML inicial.
Al igual que con XSLT (estilos) es posible que se quiera solo un conjunto de nodos dependiendo de
un patrn de bsqueda. Si queremos todos los libros que tengan menos de 300 hojas la consulta
podramos completarla as:
doc(libros.xml)//Libros/libro[NumPaginas<300]

6
Y si quisieramos los autores de los libros que tienen menos de 300 pginas?

7
Los ejemplos vistos hasta ahora son una forma sencilla de realizar bsquedas y selecciones de
nodos concretos en un documento XML. Pero hay otra forma, mucho ms potente, para realizar este
trabajo. Es lo que se denomina expresiones FLWOR. FLWOR es el acrnimo de For, Let, Where,
Order by, Return. Una expresin FLWOR equivalente a la ltima consulta realizada podra ser:
for $libro in doc(libros.xml)/Libros/libro
where $libro/NumPaginas<300
return $libro/autores
Mas informacin en: http://www.stylusstudio.com/xquery_flwor.html
for: esta sentencia permite seleccionar los nodos que se quieren consultar, guardndose en la
variable (el identificador que le precede al smbolo $).
let: esta clusula es opcional. Establece una nueva variable sobre el mismo u otro
documento XML. Permite simplificar las expresiones posteriores y tener un cdigo mucho
ms legible.
where: clausula que permite establecer una condicin sobre la variable indicada en for y/o
let.
order by: define el orden de presentacin de resultados.
return: permite devolver un valor concreto de los resultado obtenidos de las anteriores
clausulas (uno por nodo)

Consultas.
Antes de seguir, crearemos un nuevo documento XML. La razn fundamental es que necesitamos
un documento ms denso en datos para poder realizar ejemplos ms complejos.
Imaginemos que tenemos un conocido que se gana la vida con una academia de bailes de saln. Nos
pide ayuda para almacenar informacin que considera fundamental:
Nombre del baile
Precio de la clase (indicando la periodicidad de la cuota y la moneda de pago)
Numero de plazas disponibles.
Fecha de comienzo
Fecha de fin
Nombre del profesor
Sala en la que se desarrollan las clases.
Crea un ejemplo con 6 bailes. Cada baile tendr un atributo que ser su identificador. La cuota y la
moneda de pago tambin sern atributos.
Para probar nuestras consultas utilizaremos el Debugger de XQuery. Pincha sobre el botn:

Ahora podrs acceder al men Debugger > Run o hacer clic sobre el botn:

8
<?xml version="1.0" encoding="UTF-8"?>
<Bailes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="bailes.xsd">
<baile id="1">
<nombre>Tango</nombre>
<precio cuota="mensual" moneda="euro">27</precio>
<plazas>20</plazas>
<comienzo>1/1/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Roberto Garca</profesor>
<sala>1</sala>
</baile>
<baile id="2">
<nombre>Cha-cha-cha</nombre>
<precio cuota="trimestral" moneda="euro">80</precio>
<plazas>18</plazas>
<comienzo>1/2/2011</comienzo>
<fin>31/7/2011</fin>
<profesor>Miriam Gutierrez</profesor>
<sala>1</sala>
</baile>
<baile id="3">
<nombre>Rock</nombre>
<precio cuota="mensual" moneda="euro">30</precio>
<plazas>8</plazas>
<comienzo>1/1/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Nuria Mendiola</profesor>
<sala>1</sala>
</baile>
<baile id="4">
<nombre>Merengue</nombre>
<precio cuota="trimestral" moneda="dolares">75</precio>
<plazas>12</plazas>
<comienzo>1/1/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Jesus Lozano</profesor>
<sala>2</sala>
</baile>
<baile id="5">
<nombre>Salsa</nombre>
<precio cuota="mensual" moneda="euro">32</precio>
<plazas>10</plazas>
<comienzo>1/1/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Jesus Lozano</profesor>

9
<sala>2</sala>
</baile>
<baile id="2">
<nombre>Paso doble</nombre>
<precio cuota="anual" moneda="euro">320</precio>
<plazas>8</plazas>
<comienzo>1/1/2011</comienzo>
<fin>1/12/2011</fin>
<profesor>Miriam Gutierrez</profesor>
<sala>2</sala>
</baile>
</Bailes>

Establezcamos las siguientes consultas:


CONSULTA 1: Se necesita saber qu bailes se realizan en la sala nmero 1:
for $baile in doc("bailes.xml")//Bailes/baile
where $baile/sala = 1
return $baile/nombre

El resultado sera el siguiente:


<?xml version="1.0" encoding="UTF-8"?>
<nombre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Tango</nombre>
<nombre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Cha-cha-cha</nombre>
<nombre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Rock</nombre>

Como puede observarse en la imagen anterior los resultados salen con las etiquetas XML. Si
quisiramos solo tener un listado, obviando las etiquetas, simplemente tendramos que indicar en la
clausula return que extraiga los datos de ese elemento XML:
Se necesita saber qu bailes se realizan en la sala nmero 1:
for $baile in doc("bailes.xml")//Bailes/baile
let $n:=$baile/nombre
where $baile/sala = 1
return data($n)
Resultado:
<?xml version="1.0" encoding="UTF-8"?>Tango Cha-cha-cha Rock
Tal y como se ve en la imagen anterior los resultados ya no aparecen con las etiquetas del elemento
que los contiene. Todo debido a la funcin data(<variable>), que extrae del nodo la informacin
almacenada.
CONSULTA 2: se necesita extraer los nodos de aquellos bailes que se impartan en la sala numero 2
y cuyo precio sea menor de 35 euros.
for $baile in doc("bailes.xml")//Bailes/baile
let $n:=$baile/nombre
where $baile/sala = 2 and $baile/precio < 35 and $baile/precio[@moneda="euro"]
return data($n)

10
El resultado:
<?xml version="1.0" encoding="UTF-8"?>Salsa
CONSULTA 3: Se necesita saber el nombre de los profesores que dan clases con cuotas mensuales:
for $baile in doc("bailes.xml")//Bailes/baile
let $profesor:=$baile/profesor
where $baile/precio[@cuota="mensual"]
return $profesor
El resultado sera:
<?xml version="1.0" encoding="UTF-8"?>
<profesor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Roberto Garca</profesor>
<profesor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Nuria Mendiola</profesor>
<profesor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Jesus Lozano</profesor>

De FLWOR a HTML.
Queremos crear una consulta Xquery que tras ejecutarla nos devuelva los resultado en formato
HTML. Podemos unir dentro de una consulta etiquetas HTML y expresiones FLWOR. La nica
limitacin es que cuando se fusionan en una consulta, indiquemos al motor de consultas que parte
es la que tiene que procesar como consulta. Para ello indicaremos entre llaves que parte es FLWOR.
Veamos un par de ejemplos:
<html>
<body>
<h1>Bailes ofertados</h1>
<table border="1">
<tr>
<th>Nombre baile</th>
<th>Nombre profesor</th>
<th>Plazas</th>
</tr>
{
for $baile in doc("bailes.xml")//Bailes/baile
let $nombre:=$baile/nombre
let $profesor := $baile/profesor
let $plazas := $baile/plazas
return
<tr>
<td>{data($nombre)}</td>
<td>{data($profesor)}</td>
<td>{data($plazas)}</td>
</tr>
}
</table>
</body>
</html>
El resultado sera:

11
<?xml version="1.0" encoding="UTF-8"?>
<html>
<body>
<h1>Bailes ofertados</h1>
<table border="1">
<tr>
<th>Nombre baile</th>
<th>Nombre profesor</th>
<th>Plazas</th>
</tr>
<tr>
<td>Tango</td>
<td>Roberto Garca</td>
<td>20</td>
</tr>
<tr>
<td>Cha-cha-cha</td>
<td>Miriam Gutierrez</td>
<td>18</td>
</tr>
<tr>
<td>Rock</td>
<td>Nuria Mendiola</td>
<td>8</td>
</tr>
<tr>
<td>Merengue</td>
<td>Jesus Lozano</td>
<td>12</td>
</tr>
<tr>
<td>Salsa</td>
<td>Jesus Lozano</td>
<td>10</td>
</tr>
<tr>
<td>Paso doble</td>
<td>Miriam Gutierrez</td>
<td>8</td>
</tr>
</table>
</body>
</html>

Para almacenar el resultado en un fichero automticamente (este fichero puede ser de extensin
.html), escribe la ruta del archivo de salida en el cuadro de texto Output que podrs encontrar en la
barra de herramientas:

12
13
Actualizacin.
Hasta el momento solo se han podido realizar consultas sobre los contenidos almacenados en XML.
Quizs nuestro amigo desea insertar, reemplazar, cambiar y/o borrar informacin de la base de
datos.
Ms informacin:
http://exist.sourceforge.net/update_ext.html
http://stackoverflow.com/questions/5335046/xquery-update-insert-or-replace-depending-if-node-
exists-not-possible

Insercin.
Queremos aadir un nuevo baile en la base de datos. Los datos son:
Nombre: Foxtrot
Precio: 22 dlares
Pago: mensual
Plazas: 12
Comienzo: 01/01/2012
Fin: 31/07/2012
Profesor: Freddy Astaire
Sala: 3

La forma de realizar una insercin es:

insert node
<baile id="7">
<nombre>Foxtrot</nombre>
<precio cuota="mensual" moneda="dolares">22</moneda>
<plazas>12</plazas>
<comienzo>01/01/2012</comienzo>
<fin>31/07/2012</fin>
<profesor>Freddy Astaire</profesor>
<sala>3</sala>
</baile>
before doc("bailes.xml")//Bailes/baile[1]

Este cdigo inserta el nodo indicado en el documento XML. El nodo se insertar antes del primer
nodo de la base de datos (por la clausula before). Si se quiere insertar despus, solamente
cambiaramos before por after. Ambas pueden usar como referencia el primer nodo ([1])
Una sentencia equivalente para insertar al principio de la BD sin tener que referenciar a nodo

14
alguno de la base de datos, sera sustituyendo la ltima lnea por esta otra:
as first into doc(bailes.xml)//Bailes

Si por el contrario, lo que se desea es insertar al final de la BD, sin referenciar ningn nodo,
haramos:
as last into doc(bailes.xml)//Bailes

Reemplazo.
En la insercin anterior se cometieron dos errores:
1. El nombre correcto era Angel Correllada
2. El nmero de plazas eran realmente 14.
Si la insercin anterior se hizo antes del primer nodo de la base de datos, entonces el elemento
insertado ser ahora el primero. Se cambiarn esos datos de dos formas:
Mediante modificacin del valor nodo
Mediante el reemplazo del nodo completo.

15

Вам также может понравиться