Este es el Post #17 del Topic: Guía Práctica de PostgreSQL
SUGERENCIA:
Si has utilizado la base de datos dbadmision en ejercicios previos es mejor volver a crearla.Descargar Script: DBAdmision.sql
En este post me dedicaré a ejemplificar el uso del tipo de dato XML, el uso de las funciones XML y la exportación de consultas hacia XML con PostgreSQL.
La tecnología XML nos ha facilitado constantemente en lograr compatibilidad entre diversos formatos y permitir compartirlos entre distintas aplicaciones y sin duda en bases de datos su funcionalidad debería ser también muy aprovechada.
El esquema que habrá que respetar en el entorno de bases de datos, y en el caso específico de postgres es el siguiente:
<catalogname>
<schemaname>
<tablename>
<row>
<colname1>value</colname1>
<colname2 xsi:nil='true'/>
...
</row>
...
</tablename>
...
</schemaname>
...
</catalogname>
No voy a entrar al detalle de lo que es XML, tampoco de todas las funciones habidas y por haber sobre el, sin embargo desarrollaremos una parte importante que nos sacará de apuros en algún momento o situación. Algunas de las funciones brindades por postgres sobre XML que usaremos en este post son:
- XMLCOMMENT
- XMLCONCAT
- XMLELEMENT
- XMLFOREST
- XMLAGG
- QUERY_TO_XML
- TABLE_TO_XML
Para comprender la funcionalidad de cada uno de ellos creo que más vale una ejecución que mil palabras, ¿hace falta recordar que base de datos usaremos para este ejemplo?.
1- Comprobando algunas funciones XML:
SELECT xmlelement(name Contacto, IDContacto) FROM Persona.Contacto;
SELECT xmlelement(name Paterno, Paterno),xmlelement(name Materno, Materno) FROM Persona.Contacto;
SELECT xmlforest(Paterno, Materno) FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlforest(Paterno, Materno)) FROM Persona.Contacto;
SELECT XMLAgg(XMLForest(Paterno, Materno)) FROM Persona.Contacto;
SELECT XMLElement(name Contacto, XMLAgg(XMLForest(Paterno, Materno))) FROM Persona.Contacto;
2- Creamos una secuencia para usarlo como numeración de la estructura resultante:
--DROP SEQUENCE seq_contacto;
CREATE TEMP SEQUENCE seq_contacto;
SELECT xmlelement(name Contacto
,xmlattributes(nextval('seq_contacto') AS "row")
,xmlforest(Paterno, Materno) )
FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlforest(Paterno, Materno, Nombres) ) FROM Persona.Contacto;
SELECT xmlelement(name Persona ,xmlelement(name Contacto ,xmlattributes(IDContacto) ,Paterno ,Materno ,Nombres) ) FROM Persona.Contacto;
3- Usando xmlcomment para comentar sobre XML
SELECT xmlelement(name Persona
,xmlcomment('Comentario')
,xmlforest(Paterno, Materno,Nombres))
FROM Persona.Contacto;
SELECT xmlelement(name Paterno, Materno) ,xmlelement(name Materno, Materno) FROM Persona.Contacto;
SELECT xmlconcat(xmlelement(name Paterno, Materno) ,xmlelement(name Nombres, Nombres)) FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlconcat( xmlelement(name Paterno, Paterno) ,xmlelement(name Materbo, Materno))) FROM Persona.Contacto;
4- Creamos una tabla que contenga un campo de tipo XML, veremos luego una manera especial de manipularlas.
--DROP TABLE Persona.ContactoXML; CREATE TABLE Persona.ContactoXML (col1 XML); INSERT INTO Persona.ContactoXML(SELECT xmlelement(name Contacto ,xmlconcat( xmlelement(name Paterno, Paterno) ,xmlelement(name Materno, Materno) ) ) FROM Persona.Contacto);
SELECT col1 FROM Persona.ContactoXML;
5- XPATH nos facilitará en la seleccion de campos dentro de una estructura de datos XML:
SELECT xpath('/contacto/materno/text()', col1)
FROM Persona.ContactoXML ;
SELECT xpath('/contacto/paterno/text()', col1)
FROM Persona.ContactoXML ;
SELECT columna[1]
FROM ( SELECT xpath('/contacto/materno/text()', col1) AS columna
FROM Persona.ContactoXML ) AS xmlsource;
6- Mucho ojito a estas dos últimas funciones, su poder radica en que puede generar una completa estructura XML a nivel de consulta o de una tabla completa:
SELECT query_to_xml('SELECT Nombres,Paterno,Materno FROM Persona.Contacto'
,FALSE,FALSE,'Contactos')
SELECT table_to_xml('Persona.Contacto',FALSE,FALSE,'Contactos')
Recursos Utilizados para el desarrollo de este post:
SQLXML-For-Postgres-Developers
XML Document Support
XML and Databases
XML Type

Thanks for sharing. I read many of your blog posts, cool, your blog is very good.