You are on page 1of 38

Parsers XML

LENGUAJES PARA
INTERNET
2006
María Rodríguez Fernández
Relaciones entre aplicaciones y
documentos

Cadena de caracteres

Documentos
XML Serializador APLICACIÓN
APIS
XML
estandarizados
Analizador
¿Qué es un parser XML?

 Un parser o procesador o analizador


sintáctico procesa el documento XML y
verifica que es XML bien formado (y/o válido)
 Es la herramienta principal de cualquier
aplicación XML. Podemos incorporarlos a
nuestras aplicaciones, de manera que estas
puedan manipular y trabajar con documentos
XML
Parsing

Documento
XML

Aplicación
Parser XML
XML

XML DTD
XML Schema
Tipos

 Sin validación: chequea que el documento


esté bien formado de acuerdo a las reglas
de sintaxis de XML
 Con validación: además de comprobar que
el documento está bien formado, comprueba
que éste sea válido utilizando un DTD

En el caso de utilizar un DTD, es


preferible utilizar un parser con validación
Parsers
 Los navegadores incluyen sus propios
parsers.
 Microsoft Internet Explorer 5 (o superior), que
utiliza el parser de MS (incluido en la librería
MSXML.DLL)
 Mozilla, que internamente utiliza el parser EXPAT
(escrito en C)
 DOM y SAX son parsers XML que
comprueban que el documento esté bien
formado y válido
SAX y DOM
 Las APIs de SAX y DOM están
estandarizadas y existen un gran número de
implementaciones para distintos lenguajes
(C++, Java, etc.)
 Ej.: Apache Software Foundation proporciona Crimson
(SAX y DOM sólo para Java), Xerces (SAX y DOM) y
Xalan (XSL)
 En el caso de Java, familia de paquete org.xml.sax y
org.w3c.dom (básicamente contienen interfaces y clases
abstractas)
 Lo que no está estandarizado es cómo crear instancias de
los parsers
JAXP (Java API for XML
Processing)
Forma parte de J2SE 1.4
 Define un API para trabajar con parsers SAX, DOM y
transformaciones XSL
 Proporciona factorías para crear instancias de parses y
transformadores XSL de manera portable
 Sun proporciona una implementación de JAXP para
versiones anteriores a J2SE 1.4
 Incluye las APIs org.xml.sax, org.w3c.dom y javax.xml.
{parsers, transform}
 Incluye Crimson y Xalan como implementaciones por defecto
 Se pueden usar otras implementaciones vía configuración
Guión práctica

 http://petra.euitio.uniovi.es/~mariarf
SAX (Simple API for XML)

 Define un interfaz común implementado


por muchos XML Parsers
 Es el estándar de-facto para
procesamiento de XML basado en
eventos
 Desarrollado por XMLDEV (Mayo 1998)
 Multiplataforma
Características de SAX

 SAX lee secuencialmente de principio a


fin, sin cargar todo el documento en
memoria
 Ventaja: eficiencia en cuanto al tiempo y
la memoria empleados en el análisis
 Desventaja: no disponemos de la
estructura en árbol de los documentos
Conceptos básicos SAX

 Analizador SAX: “hace el


trabajo sucio”
 El manejador de contenido
contiene los procedimientos que
se invocan cuando se identifica
un elemento
Manejadores de contenido
 SAX define cuatro
manejadores. Los
demás los tiene que
construir el
programador

XML
Manejadores estándar
 ContentHandler
 permite manejar eventos relacionados con los datos de un
documento XML
 ErrorHandler
 recibe información sobre errores en los datos del
documento XML
 DTDHandler
 permite manejar eventos relacionados con el análisis de un
DTD. No atiende a eventos relacionados con la validación.
Poco usado
 EntityResolver
 analiza entidades externas que se especifican en el
documento XML que se está analizando.
Funcionamiento
 Durante el reconocimiento del documento...
 ...cada vez que se identifica una estructura (elemento)
se mira si hay un procedimiento que manipula ese
elemento
 se llama al procedimiento
 cuando termina, continua con el reconocimiento
 Los procedimientos permiten procesar el
documento guiado por eventos
 Los eventos son las ocurrencias de los elementos a
los que hacen referencia
SAX-Documento XML
XML Document SAX Objects
<?xml version=“1.0”?> Parser startDocument

<addressbook> Parser startElement


<person>

<name>Diego Ipiña</name> Parser startElement & characters

<email>dipina@deusto.es</email> Parser startElement & characters

</person> Parser endElement

<person> Parser startElement


<name>Asier Perallos</name> Parser startElement & characters

<email>perallos@deusto.es</email> Parser startElement & characters

</person> Parser endElement


</addressbook> Parser endElement & endDocument
Ejemplo simple
import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*; Implementación
import org.apache.xerces.parsers.SAXParser; del manejador de
contenido
public class SimpleSAX extends DefaultHandler {
public void startElement(String ns, String local, String
qName, Attributes atts) {
Cuando
System.out.println("startElement: "
encuentra un
+ local);
elemento lo
}
muestra
public static void main(String[] args) throws SAXException {
SimpleSAX s = new SimpleSAX();
Fijamos nuestro
SAXParser p = new SAXParser();
manejador de
p.setContentHandler(s);
contenido
try {
p.parse(args[0]);
} Parseamos el
catch (Exception e) {e.getMessage(); } documento
}
}
JAXP
 javax.xml.parsers.SAXParserFactory
 El programador obtiene un analizador con el

método estático newInstance


 La documentación JavaDoc documenta varias formas
de especificar el nombre de la clase concreta de la
factoría
 Si no se especifica ninguna, por defecto, devuelve una
dependiente del sistema
 Permite configurar determinados aspectos
globales de los parsers que creará
 Ej.: saxParserFactory.setValidating(true)
Implementación

 org.xml.sax.XMLReader
 Permite parsear el documento XML
 Antes es preciso establecer gestores de eventos
 Gestor de errores
 Clase que implementa org.xml.sax.ErrorHandler
 Gestor de eventos de contenido (apertura de tag, cierre
de tag,etc.)
 Clase que implementa org.xml.sax.ContentHandler
Excepciones
 org.xml.sax.SAXParseException: subclase de
org.xml.sax.SAXException. Contiene:
 Un mensaje descriptivo

 Información sobre la localización del error (org.xml.sax.Locator)

 Opcionalmente, una excepción encapsulada

 Cada vez que el parsing encuentra un error llama al método


correspondiente
 Si el método devuelve SAXParseException, la ejecución del
parser termina
 XMLReader.parse devuelve la excepción

 Tipos de errores:
 Warnings y errores: algo no es conforme al DTD

 Errores fatales: el documento no está bien formado


Jerarquía
JAXP-Código Java
// Crear un JAXP SAXParserFactory
SAXParserFactory spf =
SAXParserFactory.newInstance();

// Crear JAXP SAXParser->Envoltorio de xmlreader


SAXParser saxParser = spf.newSAXParser();

// Obtener SAX XMLReader


XMLReader xmlReader = saxParser.getXMLReader();

// Dar valor al ContentHandler de XMLReader


xmlReader.setContentHandler(new SAX());

// Llamar al XMLReader para parsear el documento XML


xmlReader.parse(filename);
DOM (Document Object Model)
 Para extraer la información
que contiene un documento Desaprovecharía una de
las ventajas de XML: el ser
XML, se podría escribir
una forma estructurada de
código para analizar el representar datos
contenido del archivo XML
(archivo de texto)

DOM define una interfaz


 Utilizar un parser de XML, estándar para
compatible con el modelo facilitar el acceso al contenido
de objeto de documento de los documentos XML
(DOM) de XML.
DOM: El modelo de objetos del
documento
 El DOM es el medio por el que se
puede acceder y manipular un
documento XML
 Provee una representación de un
documento XML en forma de un
árbol
 Cada elemento es un “nodo”
 Los elementos hijos y el texto
contenido dentro de un elemento son
subnodos
Características DOM

 Documento se carga totalmente en memoria


en una estructura de árbol
 Ventaja: fácil acceder a datos en función de
la jerarquía de elementos, así como modificar
el contenido de los documentos e incluso
crearlos desde cero.
 Desventaja: coste en tiempo y memoria
que conlleva construir el árbol
Implementaciones
 Los navegadores implementaron DOM
propietarios para HTML compartiendo el que
definía ECMAScript pero siendo
incompatibles entre sí
 Los DOM propietarios eran incompletos
 Un buen DOM debe ser completo:
 Permitir (re)construir un documento completo

desde el modelo
 Acceder a cualquier parte de un documento

original
El DOM del W3C
 El W3C creó una recomendación de DOM para XML.
http://www.w3.org/DOM
 para HTML y XML.
 El DOM W3C permite acceder a todas las partes de
un documento.
 Existen tres niveles de DOM:
 Nivel 0: es una formalización del DOM HTML definido
implícitamente por JavaScript.
 Nivel 1: permite acceder a todas las partes de un
documento XML pero no a la DTD ni a las hojas de estilo.
 Nivel 2: permite acceso a la DTD, hojas de estilo y
espacios de nombres.
 El DOM pretende constituir un API que pueda
ser utilizado por distintas aplicaciones
Conceptos básicos
 Analizador DOM: Crea una estructura de tipo árbol
 Manipulación del árbol. Objetos W3C DOM:
 Element – un elemento XML
 Attribute – un attributo
 Text – texto contenido en un elemento o atributo
 CDATAsection – sección CDATA
 ProcessingInstruction – Una instrucción de procesamiento
 Comment – Contenido de un comentario de XML
 Document – El objeto documento
 DocumentType – Referencia al elemento DOCTYPE
 DocumentFragment – Referencia a fragmento de documento
Objetos relacionados con Nodos

 Node – un nodo en el árbol de un documento


 NodeList – una lista de objetos nodos
 NamedNodeMap – permite interacción y
acceso por nombre a una colección de
atributos
Jerarquía de clases
Ejemplo Document_nod
e
DOCUMENT
 Se representa como un árbol
<DOCUMENT>
<TABLE> TABLE
<BODY>
<TR> Element_node
<TD>Shady Grove</TD> BODY
<TD>Aeolian</TD>
</TR>
TR TR
<TR>
<TD>Over the River, Charlie
</TD> TD TD TD TD
<TD>Dorian</TD> Cdata_section_nod
</TR> e
</BODY> Shady Over
</TABLE> Grove Aeolian theRiver, Dorian
Charlie
</DOCUMENT
Métodos para navegar por el DOM
 getDocumentElement() Devuelve el elemento raiz
 getFirstChild() Devuelve el nodo que es el primer
"hijo" de este nodo.
 getNextSibling() Devuelve el nodo que es el
siguiente "hermano" de este nodo.
 getLastChild() Devuelve el nodo que es el último
"hijo" de este nodo.
 getPreviousSibling() Devuelve el nodo que es el
último "hermano" de este nodo.
 getAttribute(java.lang.String attrName) Devuelve
un objeto string que representa el valor de un
atributo.
DOM doc

DOCUMENT documentElement

TABLE childNodes.item(0)

BODY getElementByTagName(“titulo_tabla”)

TR TR

TD TD TD TD

Shady Over
Grove Aeolian theRiver, Dorian
Charlie

doc.documentElement.childNodes.item(0).getElementsByTagName(“titulo_tabla”)
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;
Se crea un
public class XML_Parser{ parser DOM
public static void main(String[] args){
try{
Se parsea el
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
documentBuilder db = dbf.newDocumentBuilder();
documento
Document doc = db.parse(new File(filename));
display(doc); Se obtiene un
catch (Exception e){…}
} tipo de objeto
public static void display(Node node){ Document
if (node==null) return null;
int type = node.getNodeType();
switch (type) { Si el
case Node.DOCUMENT_NODE: { documento no
display(((Document)node).getDocumentElement()); es válido o
break;}
case Node.ELEMENT_NODE: bien formado
NodeList childNodes = node.getChildNodes();
if (childNodes != null) {
length=childNodes.getLength(); Para cada
for(i=0;i<length;i++)
display(childNodes.item(i));
hijo se llama
} a la función
break;} display
case Node.CDATA_SECTION_NODE: { (recursivo)
// Print values
break;}
}}
SAX vs DOM
 SAX
 Consumo mínimo de memoria => eficiencia
 Es secuencial
 No es fácil acceder a elementos anteriores, hermanos, etc.
 No es apropiado para generar XML
 DOM
 Máximo consumo de memoria
 Permite acceder fácilmente a todos los detalles del documento
 Más sencillo que SAX
 Permite construir y/o modificar árboles, y generar XML
 Actualmente cada parser ofrece una forma específica de generar
XML, pero esta deficiencia se corregirá en breve (DOM Level 3)
 Soporte para HTML
SAX vs. DOM
 En general, para situaciones similares a las del
ejemplo
 Número de asignaturas demasiado grande => SAX
 Número de asignatura no demasiado grande, pero muchos
threads realizando la operación de parseo => SAX
 Número de películas no demasiado grande y pocos
threads parseando => SAX o DOM
 En resumen, es una cuestión de consumo de memoria
 Si es mucha => SAX

 En otro caso => SAX o DOM


Referencias

 W3schools. http://www.w3schools.com
 La especificación de SAX 2.0/Java está en:
http://
www.megginson.com/SAX/Java/index.html
 Especificación DOM. www.w3.org/DOM/
 JAXP. java.sun.com/webservices/jaxp/
¿Alguna pregunta?

You might also like