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.
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.