Академический Документы
Профессиональный Документы
Культура Документы
LENGUAJES DE MARCAS Y
SISTEMAS DE GESTIN DE INFORMACIN
UNIDAD DE TRABAJO 5:
XML. TRATAMIENTO Y
RECUPERACIN DE DATOS
Esta obra est bajo una licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 Espaa de Creative Commons. Para ver una copia de esta
licencia, visite:
http://creativecommons.org/licenses/by-nc-sa/3.0/es/
o enve una carta a:
Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.
LMSGI U.T.5: TRATAMIENTO Y RECUPERACIN DE DATOS
UNIDAD DE TRABAJO 5:
TRATAMIENTO Y RECUPERACIN DE DATOS
Contenido
1.- INTRODUCCIN
En esta unidad se introducirn las bases de datos XML nativas, que son una alternativa a las relacionales. Se
sustituyen las tablas con sus campos por documentos XML con sus elementos y atributos.
Para practicar con este tipo de bases de datos, se utilizar el sistema gestor de bases de datos BaseX,
y aprenderemos dos lenguajes de consulta de documentos XML:
Por un lado se conocer XPath, un lenguaje sencillo de expresiones que permite acceder a partes de un
documento XML.
Por otro lado se aprender XQuery, otro lenguaje, que hace uso de XPath, y que facilitar la
manipulacin de documentos XML. Se podr extraer partes de un documento, generar documentos
nuevos a partir de los datos de los originales, etc.
Todas las bases de datos relacionales estn centradas en los Datos, pues lo que ellas almacenan en sus
campos son datos simples, ms conocidos como datos atmicos. Una base de datos nativa en XML, no posee
campos, ni almacena datos atmicos, sino que almacena documentos XML. Por lo tanto, a este tipo de bases
de datos se les denomina bases de datos centradas en documentos. Mientras que las base de datos
relacionales son adecuadas para almacenar datos, las bases de datos nativas XML son adecuadas para
almacenar documentos.
A continuacin vamos a iniciarnos en el manejo de BaseX, que ser el sistema gestor de bases de datos
nativas XML que emplearemos en esta unidad.
2.2.- BASEX
BaseX es un motor de bases de datos nativo XML, ligero, de alto rendimiento en las operaciones y fcilmente
escalable. Incluye, as mismo, procesadores de XPath y XQuery. Con BaseX se puede crear una base de datos
que est constituida por uno o ms documentos XML. Ya no son tablas como en los sistemas gestores de
bases de datos relacionales, sino documentos XML.
Despus podremos acceder al contenido de estos documentos con diferentes lenguajes de consulta,
como XPath y XQuery.
Con BaseX podemos visualizar de diferentes formas el documento XML que estamos manejando:
En formato texto (resultado)
En forma de rbol
Se va a utilizar este programa, sencillo en su manejo, como herramienta para introducir dos
lenguajes de consulta de documentos XML: XPath y XQuery.
Lo necesario para comenzar es saber cmo crear bases de datos XML nativas. Para ello, basta
Copyleft - Jos Manuel Rubira Miranda 2017 5
LMSGI U.T.5: TRATAMIENTO Y RECUPERACIN DE DATOS
con seleccionar el men Base de Datos y la opcin Nuevo. Aparecer una ventana donde se solicita seleccionar
un archivo XML o un directorio que contenga algn archivo XML. BaseX puede crear bases de datos asociadas
a uno o a varios archivos XML. Una vez seleccionado el archivo o directorio y asignado un nombre a la base de
datos, se acceder a la interfaz cuyas imgenes se han estado mostrando.
La mayora de los ejemplos del presente documento se basan en una base de datos llamada BD_Bailes
creada a partir del documento BD_Bailes.xml, y en una base de datos llamada formacionProfesional creada a
partir del documento formacionProfesional.xml, parte de cuyo contenido se muestra a continuacin:
BD_Bailes.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<Bailes>
<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 Gutirrez</profesor>
<sala>1</sala>
</baile>
...
</Bailes>
3.- XPATH
XPath forma, junto con XSLT y XSL-FO (ambos se vern en la prxima unidad), una familia de lenguajes
llamada XSL, diseados para acceder, transformar y dar formato de salida a documentos XML. La versin ms
reciente de XPath es la 2.0, que introduce algunas novedades respecto a la 1.0. Los ejemplos que aqu se
vern son compatibles con la 1.0 y se indicar cuando se introduzca alguno especfico de la 2.0.
XPath es un lenguaje de expresiones que no se usa de manera independiente, sino que suele usarse
incrustado en otros lenguajes ms potentes, como XQuery o XSLT.
Una expresin XPath es una cadena de texto que representa un recorrido en el rbol que representa un
documento XML. Las expresiones ms simples se parecen a las rutas de los archivos en el explorador de
Windows o en la shell de GNU/Linux.
Evaluar una expresin XPath es buscar si hay nodos en el documento que se ajustan al recorrido
definido en la expresin. El resultado de la evaluacin son todos los nodos que se ajustan a la expresin. Para
poder evaluar una expresin XPath, el documento debe estar bien formado.
Los tipos de nodos en XPath se corresponden con el tipo de contenido que podemos encontrar en un
documento XML: raz del documento (/), nodo documento (o elemento raz o elemento documento),
elementos, atributos, texto, comentarios, instrucciones de procesamiento y espacios de nombres.
Los tipos de datos bsicos son: string, number, boolean y node-set (conjunto de nodos).
Las expresiones XPath, al igual que los direccionamientos en un sistema de ficheros, pueden ser
absolutas (empiezan por /) o relativas (con respecto a un nodo determinado, llamado nodo de contexto).
Con / al principio de una expresin, especificamos que se trata de la raz del documento
Si separamos un elemento de otro o un elemento de un atributo utilizando el carcter /, indicamos que
el segundo elemento o el atributo estn incluidos dentro del primer elemento.
Ejemplo.- Selecciona el atributo id de todos los bailes
//baile/@id/data()
Si separamos un elemento de otro o un elemento de un atributo utilizando los caracteres //, indicamos
que el segundo elemento o el atributo son descendientes del primer elemento.
Ejemplo.- Selecciona el atributo cuota descendiente de todos los bailes
//baile//@cuota/data()
Con [ ] podemos especificar una condicin a aplicar a un elemento, o la posicin de un determinado
elemento.
Ejemplo.- El primer baile del documento
/Bailes/baile[1]
Cuando se escribe una ruta en XPath, por ejemplo a un cierto elemento /Bailes/baile/nombre, lo que se
devuelve es el conjunto de nodos llamados nombre, descendientes de baile, descendientes de Bailes,
descendiente del nodo raz. Si no existiera esa ubicacin, se devolvera el conjunto vaco.
Hay analizadores de expresiones que devuelven directamente el contenido textual del nodo o
nodos accedidos. Pero ante la duda, y para indicar al analizador que lo que se desea es el contenido textual,
se utilizar la funcin text() a continuacin de la expresin de acceso al nodo, de la forma:
/Bailes/baile/nombre/text()
Para acceder a un atributo se emplea el smbolo @. Por ejemplo, para acceder a un atributo id de
baile, se escribir /Bailes/baile/@id. Para mostrar de forma explcita el valor de los atributos se usar
la funcin data(), de la forma:
/Bailes/baile/@id/data()
En XPath 2.0 se usa la misma funcin string() para ambos casos, segn se muestra a continuacin:
/Bailes/baile/nombre/string()
/Bailes/baile/@id/string()
Son rutas equivalentes a las que indicaramos en un direccionamiento absoluto en un sistema Linux, es decir,
desde la raz hasta el elemento del cul queremos extraer la informacin. La particularidad respecto a los
sistemas de ficheros es que un nodo puede tener varios hijos que se llamen igual, mientras que en un sistema
de ficheros no puede haber dos directorios hijos de un mismo directorio padre que se llamen igual. Veamos
algunos ejemplos con el documento formacionProfesional.xml.
Ejemplo.- Todos los elementos hijos del nodo raz, es decir, el elemento documento:
/*
Ejemplo.- Todos los atributos de cualquier elemento del documento XML:
//@*/data()
A partir de aqu hay que recurrir a los elementos de XPath, comunes a cualquier lenguaje de programacin,
que sern necesarios para generar expresiones ms complejas. En particular, los operadores y las funciones.
3.4.1.- Operadores
Podemos utilizar mltiples operadores para construir las consultas XPath y XQuery. Veamos los ms comunes.
Operadores Matemticos: +, -, * , div, mod
Ejemplo.- Para cada baile, suma del nmero de plazas ms el nmero de la sala (no tiene mucho sentido,
pero es slo por probar el operador):
/Bailes/baile/(plazas+sala)
Operadores de Comparacin y booleanos: =, !=, <, >, <=, >=, and, or, not()
Ejemplo.- Nombre de los bailes en los que hay ms de 15 plazas (empleamos la funcin number() para tratar
el parmetro como un nmero)
/Bailes/baile[number(plazas)>15]/nombre/text()
3.4.2.- Funciones
avg( ): Calcula el valor medio de los valores referenciados por la variable o expresin que se le pasa.
Ejemplo.- Calcula la media de plazas de todos los bailes.
/Bailes/avg(baile/plazas)
Funciones de cadena
contains( ): Esta funcin permite buscar un texto dentro de una cadena de texto
Ejemplo.- Nombre de los bailes que contienen una n en su nombre
/Bailes/baile[contains(nombre,"n")]/nombre/text()
Otras funciones de cadena de inters son: concat( ), substring(), starts-with(), translate(), string-
length(), normalize-space().
Ejemplo.- Cuatro primeros caracteres de los nombres de los ciclos
/fP/ciclos/ciclo/substring(nombre,1,4)
Ejemplo.- Todos los nodos del rbol cuyo nombre tenga una longitud de cuatro caracteres
//*[string-length(name())=4]
Se trata de una extensin de las expresiones anteriores mediante la cual se puede seleccionar elementos en
funcin del valor de sus atributos o del propio elemento. En este caso los valores sern literales. Como ya se
ha visto en algunos ejemplos previos, se indican las condiciones entre corchetes junto al elemento al cual se
aplican. Los valores literales se indican entre comillas.
Ejemplo.- Nombre de los ciclos cuyas siglas se encuentren, en orden alfabtico, entre ASIR y SMR
/fP/ciclos/ciclo[@siglas>"ASIR" and @siglas<"SMR"]/nombre/text()
Ejemplo.- Datos del segundo mdulo de la lista de los cursados en primer curso:
/fP/modulos/modulo[curso="1"][2]
Ejemplo.- Nombre de los mdulos cuya relacin (cociente) entre duracin y ects sea mayor de 10:
/fP/modulos/modulo[(duracion div ects) >= 10]
Es el mismo caso que el anterior pero con valores recuperados mediante otras expresiones.
Ejemplo.- Nombre de los ciclos en los que se cursen mdulos de una duracin de 80 horas o ms. Primero:
En los elementos mdulo se seleccionan aquellos que tengan una duracin de 80 horas o ms y se obtienen
las siglas de los ciclos en los que se cursan:
/fP/modulos/modulo[duracion>=80]/ciclos/ciclo/@siglas
Segundo: Se muestran los nombres de los elementos ciclo cuyas siglas sean iguales a las extradas en el paso
primero:
/fP/ciclos/ciclo[@siglas=/fP/modulos/modulo[duracion>=80]/ciclos/ciclo/@siglas]/nombre/te
xt()
Ejemplo.- Nombres de mdulos que tengan una duracin mayor que la del mdulo "Sistemas operativos
monopuesto". Se usa la funcin number() para obtener el valor numrico de la duracin, de lo contrario
hara la comparacin como cadenas (donde se cumple que "100"< "20"):
/fP/modulos/modulo[number(duracion)>=/fP/modulos/modulo[nombre="Sistemas operativos
monopuesto"]/number(duracion)]/nombre
Copyleft - Jos Manuel Rubira Miranda 2017 13
LMSGI U.T.5: TRATAMIENTO Y RECUPERACIN DE DATOS
3.4.5.- Acceso a elementos mediante ejes
En XPath, los ejes son expresiones que permiten acceder a trozos del rbol XML, apoyndose en las relaciones
de parentesco o jerarqua entre los nodos. Con los ejes obtenemos un conjunto de nodos relacionados de
alguna forma con el nodo actual o nodo de contexto.
Ejemplo.- Devuelve los nodos que aparecen en el documento despus del segundo elemento ciclo:
/fP/ciclos/ciclo[2]/following::*
Ejemplo.- Devuelve los elementos hermanos menores del segundo elemento ciclo:
/fP/ciclos/ciclo[2]/following-sibling::*
La novedad ms llamativa es que dispone de los mismos tipos de datos predefinidos que los esquemas XML:
xs:string, xs:boolean, xs:date, ... Aparecen as mismo algunas funciones nuevas, como lower-case() o upper-
case() para pasar cadenas de texto a minsculas y maysculas respectivamente.
4.- XQUERY
XQuery es un lenguaje de consulta que permite extraer y procesar informacin almacenada en formato XML,
habitualmente en bases de datos nativas XML o en tablas y campos de tipo XML en bases de datos
relacionales.
Se parece al SQL (Standard Query Language - Lenguaje de Consultas Estndar) en algunas de las
clusulas empleadas (where, order by) comunes a ambos lenguajes.
Tambin se asemeja a XPath, con el que comparte modelo de datos y soporta las mismas funciones y
operadores. Se podra considerar a XQuery como un superconjunto de XPath, ya que toda expresin XPath es
una expresin XQuery vlida.
XQuery es muy amplio, pero aqu slo se ofrecer una visin introductoria. Al igual que se ha hecho
con XPath, para su estudio se utilizar el motor de bases de datos nativo BaseX. En este caso, con la base de
datos de ejemplo basada en el documento factbook.xml, que se incluye en la instalacin de BaseX (ubicado en
la ruta etc/factbook.xml), se crear una base de datos de nombre mondial, de manera que se puede hacer
referencia al documento XML indistintamente como etc/factbook.xml o como mondial. Adems seguiremos
utilizando la base de datos BD_Bailes empleada con XPath. Para probar las expresiones XQuery utilizaremos el
editor que incorpora BaseX.
En XQuery todo es una expresin que se evala a un valor. Por ejemplo, 7+3 es un cdigo vlido en XQuery
que se evala a 10. Otro ejemplo es una expresin condicional que devuelve un texto:
if (3 < 4) then "Verdadero" else "Falso"
Al evaluarse devolver el texto Verdadero.
Los tipos de datos primitivos (predefinidos) o atmicos (no compuestos) son los mismos que los de los
esquemas XML.
Numricos: enteros y reales.
Booleanos.
Cadenas de texto.
Fechas, horas y duraciones.
Tipos relacionados con XML, como QName.
Nodos XML: nodo raz, elemento, atributo, texto, comentario, instruccin de procesamiento y espacio
de nombres.
Con la funcin doc( ) se lee el documento XML que se indica como parmetro y devuelve el nodo raz o los
elementos que se indiquen mediante una expresin XPath. En la funcin doc() se puede especificar un nombre
de documento XML o el nombre de una base de datos. Si no incluimos la funcin doc(), se entiende que la
consulta se dirige a la base de datos actualmente abierta.
Copyleft - Jos Manuel Rubira Miranda 2017 15
LMSGI U.T.5: TRATAMIENTO Y RECUPERACIN DE DATOS
Ejemplo.- Con la ruta XPath //city/name se obtienen una serie de nombres de ciudades (ubicadas en
cualquier lugar del rbol XML), que se guardan en la variable $city. De ellas nos quedamos con las que
empiecen por Q, se ordenan y se muestran.
for $city in doc('mondial')//city/name
where starts-with($city,'Q')
order by $city
return data($city)
En la clusula return, la funcin data() devuelve el contenido o valor del elemento, variable o atributo
que se le pasa. Si se pasa ms de un parmetro, se debe poner todo entre parntesis.
FLWOR son las siglas de For, Let, Where, Order by y Return (en ingls se lee flower), y son una serie de
clusulas que se usan para construir expresiones XQuery. A continuacin se muestra la sintaxis bsica de las
clusulas FLWOR:
for $nombreVariable in doc(Documento o BBDD XML)/Ruta_Elementos
let $nombreOtrasVariables := valorAsignado
where condicin
order by criteriosOrdenacin [ascending|descending]
return valoresRetornados
Ejemplo.- A partir del documento XML de ejemplo factbook.xml, mostramos los pases del continente
europeo.
for $continente in doc("mondial")/mondial/continent
for $pais in doc("mondial")/mondial/country
where $continente/@id=$pais/encompassed/@continent and $continente/@name="Europe"
return data($pais/@name)
Si queremos ordenar el resultado aplicando ms de un criterio, separaremos las diferentes expresiones con
una coma.
Ejemplo.- Muestra el profesor y el nombre de cada baile ordenados por el nombre del profesor y por el del
baile.
for $bai in doc("BD_Bailes")/Bailes/baile
order by $bai/profesor, $bai/nombre
return ($bai/profesor, $bai/nombre)
Por defecto, la ordenacin de los elementos retornados es ascendente; si queremos hacerla descendente, es
suficiente con aadir el trmino descending tras la expresin de ordenacin.
Ejemplo.- Muestra el nombre y el profesor de cada baile ordenados descendentemente por el nombre del
baile.
for $bai in doc("BD_Bailes")/Bailes/baile
order by $bai/nombre descending
return ($bai/nombre,$bai/profesor)
4.4.3.- Comentarios
Para incluir un comentario en una consulta XQuery, debemos acotar el comentario entre las expresiones (: y
:).
Ejemplo.-
for $bai in doc("BD_Bailes")/Bailes/baile
order by $bai/nombre descending
(: Ahora especifico los resultados :)
return ($bai/nombre,$bai/profesor)
Contamos prcticamente con las mismas funciones que vimos para XPath. Veamos algunos ejemplos:
contains( ): Esta funcin permite buscar un texto dentro de una cadena de texto
Ejemplo.- Muestra los profesores que se llamen Roberto
for $baile in doc("BD_Bailes")//Bailes/baile
where contains($baile/profesor,"Roberto")
return $baile/profesor
count( ): Cuenta el nmero de elementos o nodos referenciados por la variable que se le pasa como
parmetro.
Ejemplo.- Cuntos bailes se realizan en la sala nmero 1?
for $bailes in doc("BD_Bailes")//Bailes
return count($bailes/baile[sala = 1])
O tambin:
count(for $baile in doc("BD_Bailes")//Bailes/baile
where ($baile/sala=1)
return $baile)
Otra forma:
let $media := avg(doc("BD_Bailes")//baile/plazas)
return $media
Ejemplo.- Se devuelve la media de los valores obtenidos en uno de los ejemplos anteriores.
avg (for $organizaciones in doc('mondial')/mondial/organization
return count($organizaciones/members))
Se pueden incluso combinar funciones, como en el caso siguiente en el que se redondea a dos
decimales el resultado de la media anterior con la funcin round-half-to-even():
round-half-to-even(
avg
(for $organizaciones in doc('mondial')/mondial/organization
return count($organizaciones/members)),2)
Otras funciones de inters son: min( ), max( ), sum( ), concat( ), replace(), substring(), ...
En algunos casos, sobre todo cuando se trata de consultas sencillas, ser posible utilizar tanto expresiones
XPath como expresiones FLWOR para obtener un resultado correcto.
Tambin podemos utilizar expresiones XPath dentro de expresiones FLWOR. Veamos un ejemplo.
Ejemplo.- Muestra los nombres de los profesores que dan clases con cuotas mensuales.
Expresiones XPath:
for $baile in doc("BD_Bailes")//Bailes/baile
where $baile/precio[@cuota="mensual"]
return $baile/profesor
Hasta ahora slo hemos realizado consultas sobre los datos almacenados en la bases de datos XML. Veamos
ahora de forma breve cmo podemos llevar a cabo operaciones de actualizacin de esos datos, es decir,
inserciones, modificaciones y eliminaciones.
4.7.1.- Insercin
Con esta orden hemos insertado un nuevo nodo (un elemento <baile>) en la base de datos BD_Bailes.
La ubicacin del nuevo nodo est determinada por la clusula before, con la que especificamos que queremos
insertar el nuevo elemento antes del elemento que especificamos a continuacin, en este caso, antes del
primer elemento <baile>, es decir, que el nuevo nodo pasa a ser el primer elemento <baile>.
Tambin podemos utilizar las expresiones after (para insertar un nodo despus del nodo
referenciado), as first into (para insertar el nodo como el primer hijo del nodo referenciado) y as last into o
simplemente into, para insertar el nodo como el ltimo hijo del nodo referenciado).
4.7.2.- Modificacin
Si queremos modificar el contenido de una base de datos XML, podemos optar por modificar un nodo
completo (replace node) o modificar el valor de un nodo (replace value of node)
Ejemplo.- Queremos cambiar el profesor del baile que aparece en primer lugar por el de "Antonio Niotona".
replace value of node
doc("BD_Bailes")/Bailes/baile[1]/profesor
with "Antonio Niotona"
Ejemplo.- Queremos modificar el nmero de plazas del baile que aparece en primer lugar, pero en vez de
modificar slo el valor, vamos a modificar el nodo completo.
replace node
doc("BD_Bailes")/Bailes/baile[1]/plazas
with <plazas>14</plazas>
Tambin podemos emplear expresiones FLWOR para llevar a cabo las modificaciones
for $bai in doc('BD_Bailes')/Bailes/baile
where contains($bai/profesor/text(),'u')
return replace value of node $bai/profesor
with "Nombre con letra u"
4.7.3.- Eliminacin
Para borrar un nodo de una base de datos XML empleamos la instruccin delete.
Otros, como ORACLE, permiten almacenar XML "de alguna manera" dentro de las tablas relacionales. A
continuacin mostraremos las capacidades del SGBD ORACLE para tratar con documentos XML. Si bien los
sistemas gestores de bases de datos de Oracle son aplicaciones con licencia propietaria, se pueden descargar
gratuitamente del sitio de Oracle siempre que el fin de su uso no sea lucrativo. Podemos utilizar por ejemplo la
versin 11 g Release 2, que encontraremos en el sitio de Oracle
(http://www.oracle.com/technetwork/products/express-edition/downloads/index.htrnl), donde tendremos que
crear una cuenta gratuita para poder descargarla. Haciendo una instalacin sin personalizar, a base de aceptar
las opciones por defecto, podremos tener disponible el sistema gestor. Slo se nos pedir una nica
contrasea para los usuarios administradores por defecto, SYS y SYSTEM. Una vez instalado, utilizaremos SQL
Developer (o el "espartano" SQL*Plus, un cliente de lnea de comandos), para ejecutar las sentencias de
ejemplo. La conexin se realizar con el usuario SYSTEM. Aunque el emplear un usuario con privilegios de
administracin va contra la ortodoxia en el manejo de sistemas gestores de bases de datos, para un caso
simplificado como ste nos valdr. No obstante, podemos crearnos un usuario especfico ejecutando las
siguientes instrucciones:
CREATE USER LMSGI IDENTIFIED BY lmsgi;
GRANT CONNECT, RESOURCE TO LMSGI;
CONN LMSGI/lmsgi;
En Oracle podremos disponer de tablas con campos de tipo XML, o bien de tablas en las que
cada fila es, directamente, un documento XML. En ambos casos, se les puede asociar un esquema XML que
valide el documento XML.
La instruccin de creacin de una tabla Contratos con un campo de tipo XML (XMLTYPE) llamado contenido,
ser:
CREATE TABLE Contratos
(
idContrato NUMBER,
fecha DATE,
contenido XMLTYPE
);
Para insertar un registro que contenga datos relacionales, as como un valor para el campo XML
contenido, ejecutaremos:
INSERT INTO Contratos VALUES (100, TO_DATE('01/01/1990'),
XMLType('<?xml version="1.0"?>
<contrato id="100">
<fecha>2015-01-01</fecha>
<lugar>Dubln</lugar>
Copyleft - Jos Manuel Rubira Miranda 2017 22
LMSGI U.T.5: TRATAMIENTO Y RECUPERACIN DE DATOS
</contrato>')) ;
Una consulta para mostrar el contenido del campo XML podra ser:
SELECT C.contenido contratoXML
FROM Contratos C;
(Atencin: el cliente SQL*PLUS tiene un bug al visualizar los contenidos XML. S funciona correctamente con
SQL*Developer, en cambio.)
La siguiente consulta devolvera el lugar del contrato extrado directamente del campo XML. Para ello,
se utiliza la funcin extract() sobre el citado campo. Adicionalmente, se usa la funcin getStringVal() para
tratar la informacin extrada como una cadena de texto. Si fuera de tipo numrico se usara en su lugar
getNumVal():
SELECT C.contenido.extract('/contrato/lugar/text()').getStringVal()
FROM Contratos C;
Otra funcin equivalente a extract() es extractValue(), que permite extraer un dato de un campo XML
sin tener que preocuparse de qu tipo es. La sintaxis cambia con respecto a extract(), ya que recibe dos
parmetros, el campo de tipo XML y la expresin XPath que indicar qu informacin se extrae:
SELECT extractValue(C.contenido,'/contrato/fecha') Fecha
FROM Contratos C;
Se podra realizar otra consulta con la funcin existsNode(), que verifica si existe un cierto elemento en
el campo XML. Devuelve 1 si existe y 0 si no.
Ejemplo.- Mostrar el valor del campo contenido (de tipo XML) de la tabla Contratos, para aquel contrato con
identificador igual a 100 y que contenga un elemento lugar, descendiente de /contrato.
SELECT C.contenido contratoXML
FROM Contratos C
WHERE C.contenido.existsNode('/contrato[@id = "100"]/lugar')=1;
Tambin se pueden ejecutar consultas XQuery sobre campos de tipo XML. Para ello se utiliza la funcin
XMLQuery(), que recibir como parmetros la consulta XQuery, adems del nombre del campo XML.
Ejemplo.- Mostrar el identificador del contrato (campo relacional) y el lugar del contrato (extrado del campo
XML).
SELECT idcontrato, XMLQuery (
'for $c in /contrato
order by $c/lugar
return $c/lugar'
passing by value C.contenido
RETURNING CONTENT) DatosXMLRecuperados
FROM Contratos C;
Es interesante tambin la funcin XMLTable(), que mapea el resultado de una expresin XQuery,
realizada en el FROM de la consulta SELECT, con una tabla relacional virtual (semejante a una vista) cuyos
campos, de tipos de datos propios del sistema gestor con el que se trabaja, pueden ser referenciados.
Copyleft - Jos Manuel Rubira Miranda 2017 23
LMSGI U.T.5: TRATAMIENTO Y RECUPERACIN DE DATOS
XMLTable() --> Convierte el resultado de una consulta XQuery en una tabla "virtual".
Ejemplo.- A partir de una expresin XQuery sobre un campo XML, se construye una tabla virtual C2 con dos
campos, Lugar (del tipo VARCHAR2) y Fecha (del tipo DATE), que pueden ser referenciados.
SELECT C1.idContrato, C2."Lugar", C2."Fecha"
FROM Contratos C1,
XMLTABLE('/contrato'
PASSING C1.contenido
COLUMNS
"Lugar" varchar2(10) PATH '/contrato/lugar',
"Fecha" DATE PATH '/contrato/fecha') C2 ;
Para las modificaciones y eliminaciones se emplearn las instrucciones SQL update y delete.
UPDATE Contratos SET contenido =
XMLType('<?xml version="1.0"?>
<contrato id="100">
<fecha>2015-09-21</fecha>
<lugar>Beniajn</lugar>
</contrato>')
WHERE idContrato = 100;
Una forma adicional de consultar la tabla XML es haciendo alusin a la meta-columna object_value, que
muestra el contenido del documento XML almacenado en cada registro:
SELECT object_value FROM ContratosXML;
Para modificar el contenido de un documento almacenado en una tabla XML, se usar la funcin
updateXML(), dentro de un proceso de modificacin (UPDATE) de registros.
Con la funcin deleteXML() se pueden eliminar elementos de un documento XML. En s mismo, se trata
de un proceso de modificacin (UPDATE) de un registro de la tabla XML.
Ejemplo.- Se quiere eliminar el elemento /contrato/fecha de aquel contrato cuyo lugar de celebracin sea
Mnich.
UPDATE ContratosXML C
SET OBJECT_VALUE =
deleteXML(OBJECT_VALUE, '/contrato/fecha')
WHERE existsNode(OBJECT_VALUE, '/contrato[lugar="Mnich"] ')=1;
6.- BIBLIOGRAFA
Lenguajes de marcas y sistemas de gestin de informacin
J. M. Castro Ramos, J. R. Rodrguez Snchez
EDITORIAL Garceta, 2012