Inserción e extracción de información en XML

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda
La versión para imprimir ya no se admite y puede contener errores de representación. Actualiza los marcadores del navegador y utiliza en su lugar la función de impresión predeterminada del navegador.

A continuación traballaremos co sistema xestor de bases de datos relacional (SXBDR) MySQL para coñecer algunhas funcións con soporte para XML deste tipo de xestores. En concreto para a almacenaxe de información en formato XML, para a creación de documentos XML a partir de información almacenada na BBDD e para a busca de información dentro da BBDD. MySQL ten soporte para isto a través das funcións UpdateXML() ExtractValue().

Con todo, no apartado de almacenamento nativo en XML veremos que estas técnicas son moito máis doadas, xa que as NXD están pensadas especificamente para este propósito.

Almacenaxe de información en formato XML

Para almacenar ficheiros XML nunha BBDD relacional podemos crear unha táboa que conteña unha columna que sexa o documento XML como un varchar:

mysql> create database xml_db;
Query OK, 1 row affected (0.00 sec)

mysql> use xml_db;
Database changed

mysql> CREATE TABLE documentos (doc_xml VARCHAR(150));
Query OK, 0 rows affected (0.01 sec)

Para introducir os documentos podémolo facer como se fosen novos rexistros:

mysql> INSERT INTO documentos VALUES
    -> ('
    '> <book>
    '> <title>O lapis do carpinteiro</title>
    '> <author>
    '> <initial>MR</initial>
    '> <surname>Rivas</surname>
    '> </author>
    '> </book>
    '> ');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO documentos VALUES
    -> ('
    '> <book>
    '> <title>Cosmos</title>
    '> <author>
    '> <initial>CS</initial>
    '> <surname>Sagan</surname>
    '> </author>
    '> </book>
    '> ');
Query OK, 1 row affected (0.01 sec)

Existen métodos máis automatizados e rápidos para facer a carga dun ficheiro XML no MySQL, por exemplo, mediante un script PHP.

Busca e actualización de información en documentos XML almacenados na BBDD

A función ExtractValue() permite obter resultados da BBDD a partir dunha expresión XPath. Por exemplo,

mysql> SELECT EXTRACTVALUE(doc_xml,'/book/author/initial') AS INICIAIS FROM documentos;

+----------+
| INICIAIS |
+----------+
| MR       |
| CS       |
+----------+
2 rows in set (0.01 sec)

O primeiro parámetro de ExtractValue() é un documento XML (no noso caso está almacenado na columna doc_xml da táboa documentos) e o segundo unha expresión XPath. Vexamos outro exemplo:

mysql> SELECT extractValue(doc_xml,'/book/child::*') AS Titulos FROM documentos;
+-----------------------------------+
| Titulos                           |
+-----------------------------------+
| O lapis do carpinteiro            |
| Cosmos                            |
+-----------------------------------+
2 rows in set (0.00 sec)

E un último exemplo onde se inclúe unha expresión condicional na expresión XPath:

mysql> SELECT extractValue(doc_xml,'/book/author/surname[self:text()="Sagan"]') AS Nome from documentos;
+-------+
| Nome  |
+-------+
| Sagan |
|       |
+-------+
2 rows in set (0.00 sec)

A función UpdateXML() serve para actualizar un valor no documento XML almacenado na BBDD. No seguinte exemplo actualizamos todos os elementos initial co valor SUBSTITUCION:

mysql> select UpdateXML(doc_xml,'/book/author/initial','SUBSTITUCION') AS Resultado from documentos;
+---------------------------------------------------------------------------------------------------------------------+
| Resultado                                                                                                           |
+---------------------------------------------------------------------------------------------------------------------+
| 
<book>
<title>O lapis do carpinteiro</title>
<author>
SUBSTITUCION
<surname>Rivas</surname>
</author>
</book>
 |
| 
<book>
<title>Cosmos</title>
<author>
SUBSTITUCION
<surname>Sagan</surname>
</author>
</book>
                  |
+---------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Se se quere que os cambios pasen á BBDD habería que usar comando UPDATE de SQL.

Creación de documentos XML a partir dos datos

Unha operación bastante habitual é obter documentos XML a partir dos datos dunha BBDD. Por exemplo, a partir dunha consulta. No MySQL Query Browser é moi doado, tal e como se pode ver no seguinte vídeo Media:Exemplo.ogg.

Normalmente, a exportación da consulta a XML xera un documento .xml e outro .dtd ou .xsd coas restricións correspondentes a partir da BBDD.

Tamén se pode usar a liña de comando coa opción -X habilitada. Calquera operación que realicemos devolverá a saída en formato de ficheiro XML. Neste caso usamos facemos unha consulta á taboa NOTAS_ALUMNOS da base de datos alumnos:

alumno@proxecto-integrado:~$ mysql -u root -p -X
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 118
Server version: 5.1.41-3ubuntu12.9 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use alumnos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from NOTAS_ALUMNOS where nota2>8;
<?xml version="1.0"?>

<resultset statement="select * from NOTAS_ALUMNOS where nota2&gt;8;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
	<field name="nome_alumno">Corregidor Sánchez, Ana</field>
	<field name="nota1">6</field>
	<field name="nota2">9</field>
	<field name="nota3">8</field>
	<field name="materia">LINGUA</field>
	<field name="curso">3ESO</field>
  </row>
</resultset>
1 row in set (0.00 sec)

Este método permite obter moi facilemente un documento XML a partir dunha consulta pero ten a desvantaxe de que o mapeado entre a BBDD relacional e o XML é fixo, é dicir, non hai xeito de cambiar os nomes das etiquetas, controlar se os datos teñen que ser formatados como texto ou como atributos, establecer o espazo de nomes, etc.

--Rafael Veiga

--Jesús Arribi 11:24 17 feb 2011 (GMT)