Just Sherekan – Blog de Programación



Compartiendo conocimiento… intentando no reinventar la rueda…

MySQL añade soporte para XPath

En la nueva versión 5.1 de MySQL, fueron añadidas dos funciones: ExtractValue() y UpdateXML(), que permiten hacer consultas a registros con contenido XML utilizando XPath. Todavía están bastante beta, pero vale la pena mencionarlas. En este artículo vamos a ver como se usan estas funciones y que tan útiles pueden llegar a ser.

Para los que no sabían de la existencia de XPath, pueden consultar antes esta Introducción a XPath.

Básicamente, estas dos funciones nos van a permitir hacer consultas utilizando expresiones XPath, para actualizar y buscar contenido XML en nuestras tablas.

Veamos un ejemplo. Tenemos la siguiente tabla:

[sourcecode language="sql"]
CREATE TABLE personas (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
amigos TEXT NOT NULL
);
INSERT INTO personas (nombre, amigos) VALUES (“Jack Bauer”, “

Tony Almeida


Chloe O’Brian

“);
INSERT INTO personas (nombre, amigos) VALUES (“Homer Simpson”, “

Lenny


Carl

“);
[/sourcecode]

Como pueden ver, la tabla contiene un campo amigos, donde los registros almacenan contenido XML. Ahora vamos a utilizar las funciones que nos provee MySQL para modificar y buscar dentro de este contenido mediante expresiones XPath.

ExtractValue()

A esta función se le pasa como primer parámetro el contenido XML donde queremos buscar, y como segundo parámetro la expresión XPath. Devuelve el resultado de la búsqueda, y en caso de que el contenido XML no sea válido devuelve NULL.

Esta función es ideal para combinarse con la cláusula SELECT. Veamos un ejemplo con la tabla expuesta anteriormente:

[sourcecode language="sql"]
SELECT ExtractValue(amigos, “//amigo/nombre”) FROM personas;
[/sourcecode]

Fíjense que llamamos a la función ExtractValue() pasándole como contenido XML el valor del campo amigos, y una expresión XPath solicitando los nombres de los amigos. Nos devolvería:

+----------------------------------------+
| ExtractValue(amigos, "//amigo/nombre") |
+----------------------------------------+
| Tony Almeida Chloe O'Brian             |
| Lenny Carl                             |
+----------------------------------------+

Algunos ejemplos más:

[sourcecode language="sql"]
SELECT nombre, ExtractValue(amigos, “count(//amigo)”) AS cant_amigos FROM personas;
[/sourcecode]

+---------------+-------------+
| nombre        | cant_amigos |
+---------------+-------------+
| Jack Bauer    | 2           |
| Homer Simpson | 2           |
+---------------+-------------+

[sourcecode language="sql"]
SELECT nombre, ExtractValue(amigos, “//amigo[1]/nombre”) AS mejor_amigo FROM personas;
[/sourcecode]

+---------------+--------------+
| nombre        | mejor_amigo  |
+---------------+--------------+
| Jack Bauer    | Tony Almeida |
| Homer Simpson | Lenny        |
+---------------+--------------+

UpdateValue()

A esta función se le pasa como primer parámetro el contenido XML a modificar, como segundo parámetro la expresión XPath que devuelve el trozo de XML a reemplazar, y como tercer parámetro el nuevo trozo de XML. Sirve para combinarse con la cláusula UPDATE, ejemplo:

[sourcecode language="sql"]
UPDATE personas SET amigos=UpdateXML(amigos, “//amigo[1]/nombre”, “Moe“) WHERE id=2;
[/sourcecode]

Le pasamos como contenido XML el valor del campo amigos, una expresión XPath que devuelve el elemento nombre del primer amigo, y el valor de reemplazo, en este caso el nuevo nombre.

Conclusiones

Bueno, el soporte para estas funciones está aún bajo desarrollo, y la sintaxis de XPath tiene algunas limitaciones, pero aún así puede usarse para simplificar la consulta y actualización de registros con contenido XML.

Pueden consultar la documentación oficial de MySQL para más info.

3 comentarios

3 comentarios

  1. Juan Diego SPAIN Octubre 3rd, 2008 8:46 pm

    Enhorabuena por tu blog, Sherekan, me has alegrado el día.

    Por cierto, es posible que la nueva temporada de 24 consiga que tu ejemplo sea, de alguna manera, incorrecto.

  2. Matthew INDIA Octubre 17th, 2008 11:09 am

    thank u r information

    it very useful

  3. [...] consultar la documentación oficial de MySQL para más info. 2 comentarios –> Published 08-06-2009 5:05 PM por David [...]

Dejá una respuesta

Mexico