Omet navegació

3.3 - Funcions que produeixen contingut XML

Veurem en aquest apartat les funcions que ens proporciona PostgreSQL per a generar contingut XML. El resultat de totes elles és de tipus XML, i serviran per a generar un element, atribut, element arrel, concatenar, ... de manera que podrem generar contingut XML ben format. 

Són aquestes:

XMLCOMMENT

Sintaxi: xmlcomment (text)

Descripció: genera un comentari XML, amb el contingut del paràmetre. En aquest contingut no pot anar '--', per  a no confondre amb l'etiqueta del comentari

Exemple

SELECT xmlcomment('Hola');
 
  xmlcomment
--------------
 <!--Hola-->

 

XMLCONCAT

Sintaxixmlconcat (xml [, ... ])

Descripció: concatena una llista de valors XML, sent el resultat també XML

Exemple

 
SELECT xmlconcat('<primer>Hola</primer>','<segon>Adéu</segon>');
 
                xmlconcat                 
------------------------------------------
 <primer>Hola</primer><segon>Adéu</segon>
 

 

XMLELEMENT

Sintaxixmlelement (name nom [, xmlattributes (valor [AS nomatribut] [ , ... ] ) ]  [ , contingut , ... ] )

Descripció: genera un element amb el nom especificat, possibles atributs amb els seus valors, i possible contingut (si no posem contingut serà un element buit

Exemples

 
SELECT xmlelement(name primer);
 
 xmlelement 
------------
 <primer/>
 
 
SELECT xmlelement(name segon, 'Hola');
 
     xmlelement      
---------------------
 <segon>Hola</segon>
 
 
SELECT xmlelement(name tercer, xmlattributes ('Primer atribut' as a1),'Hola');  
 
             xmlelement             
------------------------------------
 <tercer a1="Primer atribut">Hola</tercer>
 

 Anem a posar ara un exemple que combine tot un poc:

 
SELECT xmlelement(name quart, xmlattributes(current_date as data),
                              xmlelement(name quart_1),
                              xmlcomment('comentari'),
                              xmlelement(name quart_2, 'valor quart 2'));
 
                                       xmlelement                      
-------------------------------------------------------------------------------------------
<quart data="2016-12-21"><quart_1/><!--comentari--><quart_2>valor quart 2</quart_2></quart>
 

O un altre molt interessant que crea un element comarca per a cada comarca de la taula COMARQUES, posant-li a més com a atribut la província:

 
   SELECT xmlelement(name Comarca,xmlattributes(provincia as Provincia),nom_c)
       FROM COMARQUES
       ORDER BY provincia,nom_c;
 

 El resultat seria aquest:

on podria sorprendre el tractament dels accents i caràcter especials, però no oblidem que és la manera de codificar aquestos caràcters en XML

XMLFOREST

Sintaxixmlforest (contingut [ AS nom] [ , ... ])

Descripció: crea una sèrie d'elements i els seqüencia un darrere de l'altre. És especialment útil quan accedim a alguna taula

Exemple

 
SELECT xmlforest('Hola' AS primer,'Adéu' AS segon);
 
                xmlconcat                 
------------------------------------------
 <primer>Hola</primer><segon>Adéu</segon>
 

 Com comentàvem és especialment útil quan accedim a taules. El següent exemple crea els element nom i província amb els valors de cadascuna de les files:


SELECT xmlforest(nom_c,provincia)
    FROM COMARQUES
    ORDER BY nom_c;
 
                          xmlforest                          
-------------------------------------------------------------
 <nom>Alacantí</nom><provincia>Alacant</provincia>
 <nom>Alcalatén</nom><provincia>Castelló</provincia>
 <nom>Alcoià</nom><provincia>Alacant</provincia>
 <nom>Alt Maestrat</nom><provincia>Castelló</provincia>
...
 

 Si açò ho enganxem amb la creació de l'element comarca, el tindrem ben format, d'una forma equivalent a una anterior, però sense atributs, tot subelements:

 
SELECT xmlelement(name Comarca,xmlforest(nom_c,provincia))                             
    FROM COMARQUES
    ORDER BY nom_c;
 
                                   xmlelement                                  
 --------------------------------------------------------------------------------
 <comarca><nom>Alacantí</nom><provincia>Alacant</provincia></comarca>
 <comarca><nom>Alcalatén</nom><provincia>Castelló</provincia></comarca>
 <comarca><nom>Alcoià</nom><provincia>Alacant</provincia></comarca>
 <comarca><nom>Alt Maestrat</nom><provincia>Castelló</provincia></comarca>
 <comarca><nom>Alt Millars</nom><provincia>Castelló</provincia></comarca>
 ...
 

 

XMLAGG

Sintaxixmagg (xml)

Descripció: podem considerar-la una funció d'agregat, que concatena tots els element que li arriben. És a dir, que xmlconcat concatena els valors dels paràmetres, però de forma aïllada, cada fila és en un resultat diferent. En canvi xmlagg els junta tots en un únic resultat.

Exemples

 
SELECT xmlagg(xmlforest('Hola' AS primer,'Adéu' AS segon));
 
                  xmlagg                  
------------------------------------------
 <primer>Hola</primer><segon>Adéu</segon>
 

Que així queda aproximadament com la concatenació. Però la utilitat gran és quan agreguem els elements d'una taula (recordeu que el paràmetre ha de ser XML)

 
SELECT xmlagg(xmlforest(nom_c,provincia))
    FROM COMARQUES;
 
                                    xmlagg                 
-------------------------------------------------------------------------------------
 <nom>Safor</nom><provincia>València</provincia><nom>Horta Sud</nom><provincia>València</provincia> ....
 

 

Per tant ara ja tenim la manera d'ajuntar totes les comarques en un únic XML i posar-li nom al conjunt:

 
SELECT xmlelement(name comarques, xmlagg(xmlelement(name comarca,xmlforest(nom_c,provincia))))
    FROM COMARQUES;
 
                                   xmlconcat                 
---------------------------------------------------------------------
<comarques><comarca><nom>Safor</nom><provincia>València</provincia></comarca><comarca><nom>Horta Sud</nom><provincia>València</provincia></comarca>...</comarques>
 

 

XMLROOT

Sintaxi: xmlroot(xml, version text | no value [, standalone yes|no|no value])

Descripció: modifica les propietats del node arrel del XML que tenim com a primer paràmetre. Si s'especifica la versió, reemplaçarà la que hi haja. I el mateix amb l'atribut standalone.

Exemple:

 
SELECT xmlroot(xmlparse(document '<primer>abc</primer>'), version '1.0', standalone yes);
 
                         xmlroot
--------------------------------------------------------------
<?xml version="1.0" standalone="yes"?> <primer>abc</primer>
 

Com podem comprovar, amb aquestes funcions podem formar un document sencer, i de forma prou senzilla.

Anem a aprofitar-ho doncs per a inserir una nova fila a la taula P_XML, on teníem un camp XML. Per a poder introduir totes les comarques en un document, i afegir-lo a aquesll taula podríem fer:

 
INSERT INTO P_XML
SELECT 3, xmlroot(xmlparse(document (SELECT xmlelement(name comarques,
xmlagg(xmlelement(name comarca,xmlforest(nom_c,provincia))))
FROM COMARQUES)),
version '1.0', standalone yes);
 

 A continuació veurem una forma molt més senzilla d'introduir tota la taula de comarques com un document XML, però aquesta forma que acabem d'utilitzar ens permetria modificar al gust el format (per exemple posant la província com un atribut)