Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

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.

images/06fig01.png

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