Saltar al contenido
Codifíca.me | Desarrollo web | Programación

Cómo crear XML usando DBMS_XMLDOM SQL PL/SQL

22 marzo, 2016

Creando XMLs usando DBMS_XMLDOM SQL PL/SQL

El paquete DBMS_XMLDOM se usa para generar o crear objetos XMLType e implementar el DOM (Document Object Model) generar objetos “webs” html-XML

El DOM define la estructura lógica de los documents (páginas) y nos ofrece la posibilidad de manipular todos estos elementos.

xml

Esta es la documentación de Oracle acerca de DBMS_XMLDOM.

Para generar los nodos y las hojas de los nodos se emplean varios elementos:

Crear nuevo documento xml:newDomDocument
Crear nodos:makeNode
Crear hijos:appendChild
Crear elementos:createElement
Crear texto (valor) dentro del elemento:createTextNode
Obtener tipo de XML:getXmlType
Generar documento:freeDocument

Generar el XML PRUEBA

Esto es un ejemplo de cómo sería el document PRUEBA, después de utilizar PLSQL para generar el XML

 

Este es un ejemplo de como se declararía/realizaría un XML con DBMS_XMLDOM y SQL.

DECLARE  
 
  xml_cert xmltype;
 
  -- variables creacion documento xml
  l_domdoc                 dbms_xmldom.DOMDocument;     
  l_Document_element       dbms_xmldom.DOMElement;
  l_root_node              dbms_xmldom.DOMNode; 
 
 
 
BEGIN
 
   -- Se crea un Documento XML vacio
   l_domdoc := dbms_xmldom.newDomDocument;
 
   -- Se crea un nodo Raiz del documento
   l_root_node := dbms_xmldom.makeNode(l_domdoc);
 
   -- Se crea el elemento Document   
 
   l_Document_element := dbms_xmldom.createElement(l_domdoc, 'Nombre' );
   dbms_xmldom.setAttribute(l_Document_element, 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');      
   dbms_xmldom.setAttribute(l_Document_element, 'xmlns', 'http://www.ruta-del-esquema');      
   dbms_xmldom.setAttribute(l_Document_element, 'xsi:schemaLocation', 'http://www.ruta-del-esquema Esquema.xsd');      
 
   -- Se crea un nodo Document y se anade al nodo raiz
   l_Document_node := dbms_xmldom.appendChild( l_root_node
                                                , dbms_xmldom.makeNode(l_Document_element)
                                                );                                                
 
 
  -- Recuperar datos.
  -- Asignarlo a las variables
  -- Generar el XML con un LOOP .
 
   etiqueta := 'Nombre';
 
 
   -- Se crea un nodo autorizado y se anade al nodo Autorizado
   l_Autorizado_node := dbms_xmldom.appendChild(l_Document_node
                                            , dbms_xmldom.makeNode(dbms_xmldom.createElement(l_domdoc, 'Autorizado' ))
                                            );
   -- Se anade el contenido al nodo autorizado 
   l_textnode := dbms_xmldom.appendChild( l_Autorizado_node
                                          , dbms_xmldom.makeNode(dbms_xmldom.createTextNode(l_domdoc, autorizado ))
                                          );
 
   -- Finalizar el LOOP.                                       
 
  -- escribe el fichero xml
  xmldom.writetofile(l_domdoc, 'DIRECTORIO/NOMBREFICHERO.XML','ISO-8859-1');    
  dbms_xmldom.freeDocument(l_domdoc);   
 
 
 
END;

Cuando tienes que crear trescientos nodos para generar un XML grande, la tarea de asignar nodos , de identificar el padre, de recuparar los valores de los nodos, asignar los hijos etc, se vuelve una tarea un poco tediosa, o lo que es lo mismo un trabajo de chino.

Para evitar tener que volverte loco generando nodos , y toda la estructura, declarar las variables y demás, he montado un generador de código XML, en el que asignas los nodos, de quienes son sus nodos superiores o padres, y si estos tienen o no valor.

Este es el link del generador de XML, pruébalo y te devolverá el codigo así como las variables que debes de integrar en tu declaración de variables, obviamente las variables y demás te las devolverá siguiendo el patrón que he puesto en el ejemplo.