Omet navegació

3.4 - Convertir taules senceres a XML

En l'últim exemple de l'apartat anterior havíem aconseguit forma un document XML a pertir de la taula Comarques i inserir-lo en un camp XML (de la taula P_XML). Aquella manera ens permet confeccionar al nostre gust l'estructura del XML. Per contra, és un poc laboriós.

Anem a veure ara dues funcions que ens permeten convertir una taula i una consulta, respectivament, a XML amb l'estructura que totes les columnes seran elements. No tindrem per tant tanta versatilitat com en l'apartat anterior. Però per contra la senzillesa és extrema.

TABLE_TO_XML

Sintaxi: table_to_xml(taula, tract_nulformat, espai_noms)

Descripció: converteix una taula en un document XML. El primer paràmetre és la taula a convertir. El segon (booleà) indica si s'inclouen els valors nuls com element buits. El tercer (booleà) implica el format que tindran els elements. El quart serveix per definir l'espai de noms; el podem deixar com una cadena nula ('').

Exemple:

Anem a fixar-nos en el tercer paràmetre. Si està a false, el nom de la taula serà l'element arrel, i per a cada fila crearà un element anomenat row, que inclourà tots els camps:

SELECT table_to_xml('COMARQUES', false, false, '');

ens donarà aquesta eixida:

 
<comarques xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<row>
  <nom>Safor</nom>
  <provincia>València</provincia>
</row>
 
<row>
  <nom>Horta Sud</nom>
  <provincia>València</provincia>
</row>
  
   ...
</comarques>
 

 En canvi si el tercer paràmetre està a true, traurà una successió d'element amb el mateix nom que la taula, amb els camps com a elements:

SELECT table_to_xml('COMARQUES', false, true, '');

ara l'eixida serà:

 
<comarques xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  <nom>Safor</nom>
  <provincia>València</provincia>
</comarques>
 
<comarques xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  <nom>Horta Sud</nom>
  <provincia>València</provincia>
</comarques>
  
...
 

 És a dir, de la primera manera el document està ben format, i de la segona és una successió d'elements.

Un exemple d'utilització (que aprofitarem per a introduir en la taula P_XML) seria intentar canviar el nom dels elements row per comarca . La solució podria ser utilitzar la funció replace() per a canviar el que volem. Només haurem d'anar en compte de convertir el document XML generat per TABLE_TO_XML a text, per poder utilitzar la funció replace, i després tornar a convertir-lo a XML. Introduirem també les taules POBLACIONS i INSTITUTS convertides en XML (substituint row per un més adequat)

 
INSERT INTO P_XML 
SELECT 4, replace(table_to_xml('COMARQUES',false,false,'')::text,'row','comarca')::xml;
 
 
INSERT INTO P_XML 
SELECT 5, replace(table_to_xml('POBLACIONS',false,false,'')::text,'row','poble')::xml;
 
 
INSERT INTO P_XML 
SELECT 6, replace(table_to_xml('INSTITUTS',false,false,'')::text,'row','institut')::xml;
 

 En la següent imatge es mostra el contingut de la taula P_XML, on s'han ampliat les noves files per poder veure el contingut:

QUERY_TO_XML

Sintaxi: query_to_xml(sent_SQLtract_nulformatespai_noms)

Descripció: absolutament equivalent a l'anterior, però la font de les dades no serà una taula, sinó una sentència SQL.

Exemple:

 

 
SELECT query_to_xml('SELECT nom_c,COUNT(*) AS num_p, AVG(altura) AS alt_mitj
FROM POBLACIONS
GROUP BY nom_c
ORDER BY 3 DESC',
false,false,'');
 

I l'eixida seria aquesta:

<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
<row>
  <comarca>Ports</comarca>
  <num_p>13</num_p>
  <alt_mitj>834.5384615384615385</alt_mitj>
</row>
 
...
</table>