El analizador de XML
Introducción
El analizador de XML permite manipular archivos XML desde el lenguaje PL/SQL. De este modo, es posible generar archivos en dicho formato de composición. Para poder implementar esta funcionalidad, el lenguaje PL/SQL utiliza el paquete xmldom con el fin de conocer y analizar la estructura del documento XML.
El lenguaje PL/SQL, actualmente empleado por los desarrolladores de aplicaciones sobre Oracle, cuenta así con la posibilidad de evolucionar hacia el lenguaje XML. El analizador de XML para PL/SQL está escrito en PL/SQL y Java. Soporta todas las especificaciones publicadas por el consorcio W3C para el estándar 1.0 de XML. Además de cumplir perfectamente el estándar, el analizador de XML para PL/SQL permite realizar un análisis simplificado del documento, respetando las directrices del W3C en lo relativo al modelo del documento (DOM, Document Object Model). También cumple las recomendaciones relativas a XSLT (hojas de estilo) y Xpath.
El analizador se encuentra en el directorio $ORACLE_HOME\xdk\plsql\parser y se incluye como estándar desde la versión 9i.
El siguiente esquema resume de forma sencilla cómo funciona esta herramienta a la hora de analizar un documento. Este esquema se aplica en los siguientes ejemplos para conocer la estructura de un documento así como los datos contenidos en dicho documento.
De este modo, todos los programas tienen la misma estructura para...
Lectura de un archivo XML
El primer paso consiste en poder leer el archivo en formato XML desde PL/SQL e interpretar correctamente los datos procedentes de dicho archivo.
Para comprender el funcionamiento del analizador, evidentemente, el método más sencillo consiste en emplear un programa simple de ejemplo. No se ilustran todas las funcionalidades del analizador pero, a partir de un ejemplo funcional, siempre es posible completar los elementos omitidos de forma relativamente sencilla.
El siguiente script permite crear un procedimiento que recibe como parámetro un nombre de archivo xml y lo abre con el fin de interpretar los datos que contiene. xmlDom y xmlParser son sinónimos públicos de los paquetes DBMS_XMLDOM y DBMS_XMLPARSER.
-- Este procedimiento permite mostrar los diferentes elementos
del documento xml
create or replace procedure MostrarElementos(doc xmlDom.DOMDocument) is
Nodos xmlDom.DOMNodeList;
longitud number;
nodo xmlDom.DOMNode;
begin
-- obtener todos los elementos del documento
Nodos:=xmlDom.getElementsByTagName(doc,'*');
longitud :=xmlDom.getLength(Nodos);
-- recorrer todos los elementos usando un bucle
for i in 0 ..longitud -1 loop
nodo:=xmlDom.item(Nodos, i);
dbms_output.put(xmlDom.getNodeName(nodo)||' ');
end...
Aplicación de una hoja de estilos a un documento XML
Una de las principales ventajas del lenguaje XML es la de poder separar de forma muy clara los datos de la presentación, lo que también es posible hacer en HTML. El siguiente ejemplo, que utiliza las funcionalidades del analizador XML para PL/SQL, permite generar un archivo de salida. xslProcessor es un sinónimo público del paquete DBMS_XSLPROCESSOR.
set serveroutput on;
create or replace procedure aplicarXSL(
directorio varchar2, archivoXml varchar2,
archivoXsl varchar2, archivoResultado varchar2,
) is
-- las variables
p xmlParser.Parser;
-- el analizador
documentoXML xmlDom.DOMDocument; -- documento
nodo xmlDom.DOMNode;
---- elementos para la hoja de estilos
motor xslProcessor.Processor;
hojaEstilo xslProcessor.Stylesheet;
documentoXSL xmlDom.DOMDocument;
elementoXsl xmlDom.DOMElement;
espacioNombre varchar2(50);
-- elementos para generar el resultado
documentoF xmlDom.DOMDocumentFragment;
elementoF xmlDom.DomNode;
begin
-- creación...
XSU
La API XSU (Utilidad Xml SQL) para PL/SQL permite generar y almacenar documentos XML desde y en la base de datos. Los paquetes que permiten implementar estas funcionalidades son DBMS_XMLQuery y DBMS_XMLSave.
1. Generación de código XML con DBMS_XMLQuery
Para poder generar un documento XML que contenga los resultados de una consulta simple usando el paquete DBMS_XMLQuery es necesario llevar a cabo los siguientes cinco pasos:
-
Crear un puntero a un contexto llamando al método DBMS_XMLQuery.getCtx y pasándole como parámetro la consulta.
-
Introducir los valores de los distintos parámetros de la consulta usando DBMS_XMLQuery.bind.
-
Definir los argumentos opcionales, como el nombre de la etiqueta ROW o ROWSET, el número de filas que se van a extraer...
-
Escribir los datos XML en un elemento CLOB (LOB de caracteres) usando la función DBMS_XMLQuery.getXML. Esta función puede trabajar con o sin un archivo DTD o un esquema.
-
Cerrar el contexto.
a. Generación de código XML a partir de una consulta
El siguiente ejemplo ilustra de forma muy sencilla cómo generar datos en formato XML a partir del contenido de la base de datos:
set serveroutput on
-- Dar formato XML al resultado de una consulta
declare
contextConsulta DBMS_XMLQuery.ctxType;
resultado CLOB;
begin
-- definición del contexto de la consulta
contextConsulta:=DBMS_XMLQuery.newContext('select * from clientes');
-- obtener el resultado
resultado:= DBMS_XMLQuery.getXML(contextConsulta);
-- mostrar el resultado
mostrarCLOB(resultado);
-- cerrar el contexto de la consulta
DBMS_XMLQuery.closeContext(contextConsulta);
end;
/
Con el fin de facilitar la presentación de los elementos en formato CLOB, se ha escrito el método mostrarCLOB:
create or replace procedure mostrarClob(cadena in out nocopy CLOB) is
cadenaXml varchar2(32767);
linea varchar2(2000);
begin
-- copiar el documento CLOB en un VARCHAR2
cadenaXml:=dbms_lob.SUBSTR(cadena, 32767);
loop
exit when cadenaXml is null;
-- Búsqueda de los finales de línea
linea:=substr(cadenaXml,1,instr(cadenaXml,chr(10))-1);
dbms_output.put_line('|...