Procesamiento de documentos XML Documentación Electrónica Soto Montalvo
Contenido Introducción Document Object Model Simple API for XML DOM vs. SAX
Cómo podemos manipular los documentos XML? SAX (Simple API for XML) Analizador basado en eventos que realiza un recorrido secuencial sobre el documento XML DOM (Document Object Model) Se genera un árbol del documento XML sobre el que se puede hacer cualquier tipo de recorrido Para acceder al documento XML se puede programar con cualquier lenguaje
Contenido Introducción Document Object Model Simple API for XML DOM vs. SAX
DOM Interfaz independiente de la plataforma y del lenguaje que permite acceder de forma fácil, consistente y homogénea a los elementos y atributos de un documento XML Un DOM completo debería permitir: Reconstrucción del documento completo a partir del modelo El acceso a cualquiera de las partes del documento Manipulaciones, adiciones y eliminaciones en el documento
DOM No está escrito para un ser usado desde un lenguaje de programación en particular Se escribió empleando un lenguaje de definición de interfaz (IDL Interface Definition Language) Para cada lenguaje de programación concreto habrá una traducción de los tipos IDL a tipos del lenguaje concreto El W3C se encarga de la especificación de DOM
DOM DOM proporciona un modelo para el documento completo representándolo como un árbol (que constituye una jerarquía de objetos nodo). Cada nodo del árbol representa: Una etiqueta (elemento) Texto encerrado por una etiquetas Los nodos del árbol están relacionados mediante vínculos del tipo: padre, hijo y hermano. La estructura permite navegar de un nodo a cualquier otro. La jerarquía completa se carga en memoria.
Interfaces DOM La especificación DOM del W3C define varias interfaces, cada una con sus propios métodos y atributos. Las interfaces básicas para comenzar a trabajar con DOM serían: Document: proporciona acceso al documento XML cargado en el objeto DOM Node: todo en un documento es un nodo, las etiquetas, los comentarios, etc Attr: permite manipular los atributos XML de un nodo (sin embargo, se suelen usan métodos de Element para trabajar con atributos) Element: la mayor parte de nodos de un documento son elementos CharacterData y Text: trata el contenido textual de un elemento
Acceso DOM Hay dos formas de acceder a un nodo en la jerarquía de nodos DOM (que se pueden combinar): Recorriendo el árbol Se comienza en cualquier parte del árbol del documento y se utilizan los siguientes atributos de node: parentnode: accede al padre firstchild: accede al primer hijo lastchild: accede al último hijo nextsibling: accede a su siguiente hermano previoussibling: accede a su hermano anterior childnodes: es una lista de hijos accesible mediante un índice A través del nombre del elemento getelementsbytagname(nombelemento), retorna una lista de nodos del mismo tipo y, mediante un índice, se accede al deseado
Ejemplo de procesamiento DOM public class EjemploDOM { public static void main(string[] args) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newdocumentbuilder(); Document document = db.parse(new File("docRecetas2.xml")); NodeList list = document.getelementsbytagname("titulo"); int i=0; while(i<list.getlength()) { Node n = list.item(i); System.out.println("contenido: "+ n.getfirstchild().getnodevalue()); i++; } } catch (Exception e) { e.printstacktrace(); } } }
Ejemplo de procesamiento DOM Será necesario importar las siguientes clases: import java.io.file; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import org.w3c.dom.document; import org.w3c.dom.node; import org.w3c.dom.nodelist; Salida de la ejecución del ejemplo: contenido: Tortilla de patatas
Ejemplo de procesamiento DOM Documento XML utilizado en el ejemplo: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE receta SYSTEM "recetas.dtd" > <receta> <titulo categoria="segundo">tortilla de patatas</titulo> <descripcion dificultad="media">typical Spanish</descripcion> <ingredientes> <ingrediente> <nombre>patata</nombre> <cantidad medida="unidades">al gusto</cantidad> </ingrediente> <ingrediente> <nombre>huevo</nombre> <cantidad medida="unidades">al gusto</cantidad>... </receta>
Contenido Introducción Document Object Model Simple API for XML DOM vs. SAX
SAX El acceso al documento XML es secuencial No crea un modelo de objetos en forma de árbol Proporciona acceso a la información mediante una secuencia de eventos SAX lanza eventos cuando comienza el análisis del documento XML, cuando finaliza, por cada etiqueta de apertura que encuentra, por cada etiqueta de cierre, etc.
Programar con SAX El programador debe: 1. Conocer la estructura del documento a procesar 2. Determinar la información que debe localizar 3. Ver cuál es la mejor forma de almacenarla en una estructura de datos 4. Determinar qué eventos y qué secuencia seguirán para localizar la información
Manejadores de eventos Los manejadores de eventos indican qué métodos se ejecutan cuando ocurren los diferentes eventos. Manejadores de eventos más comunes con SAX: ContentHandler: maneja eventos relacionados con los datos de un documento XML ErrorHandler: recibe información sobre los errores en los datos de un documento XML
Manejador de contenido El manejador ContentHandler proporciona los siguientes métodos: startdocument(): invocado cuando comienza un documento enddocument(): invocado cuando finaliza un documento startelement(nombre, atributos): invocado cuando se abre una etiqueta endelement(nombre): invocado cuando se cierra una etiqueta characters(texto): invocado cuando aparece un bloque de texto
Sobre excepciones Muchos de los métodos de respuesta a eventos SAX declaran una excepción SAXException Es el único tipo de excepción que puede lanzar un analizador SAX. Cualquier otra excepción será encapsulada en ésta
Manejador de errores Los manejadores de errores sirven para tratar los errores que se produzcan durante el análisis. error(excepción): invocado cuando el parser encuentra un error recuperable (el análisis del documento puede continuar) fatalerror(excepción): invocado cuando el parser encuentra un error irrecuperable (el análisis del documento debe finalizar) warning(excepción): invocado cuando el parser proporciona avisos (el análisis debe continuar).
Ejemplo de procesamiento SAX public class EjemploSAX { public static void main(string[] args) { XMLReader parser = new SAXParser(); MyHandler handler = new MyHandler(); InputSource inputfile = new InputSource("docRecetas2.xml"); inputfile.setencoding("iso-8859-1"); } } try { parser.setcontenthandler(handler); parser.parse(inputfile); } catch (IOException e) { e.printstacktrace(); } catch (SAXException e) { e.printstacktrace(); }
Ejemplo de procesamiento SAX Será necesario importar las siguientes clases: import java.io.file; import java.io.ioexception; import org.xml.sax.inputsource; import org.xml.sax.saxexception; import org.xml.sax.xmlreader; import com.sun.org.apache.xerces.internal.parsers.saxparser; El manejador de contenido sería: import org.xml.sax.helpers.defaulthandler; public class MyHandler extends DefaultHandler { public void enddocument() { System.out.println("FIN DEL ANALISIS DEL DOCUMENTO"); } } Salida: FIN DEL ANALISIS DEL DOCUMENTO
Contenido Introducción Document Object Model Simple API for XML DOM vs. SAX
Comparativa Utilizar DOM o SAX para analizar un documento XML? DOM: Un árbol es útil para documentos pequeños que necesitan ser procesados en su práctica totalidad Los programas que utilizan el DOM suelen requerir menos código que aquellos que emplean SAX El DOM permite generar documentos XML desde cero, hacer esto en SAX es imposible. SAX: El enfoque orientado a eventos es útil para documentos grandes en los que sólo hay que procesar una pequeña parte de la información Para buscar información SAX es más eficiente que DOM No hay un árbol que refleje el documento por lo que requiere menos memoria