Publicado el 29 de Mayo del 2018
643 visualizaciones desde el 29 de Mayo del 2018
3,3 MB
35 paginas
Creado hace 21a (29/03/2004)
XML, Servicios Web y
Web Semántica
Departamento de Informática
Universidad de Oviedo
Sesión 7
Programación XML
SAX, DOM, Enlaces
Departamento de Informática
Universidad de Oviedo
NOTA: Gran parte de estas trasparencias han sido realizadas por César F. Acebal
1
Programación XML
Los programas que manipulan XML realizan funciones similares:
Análisis del documento XML
Sintáctico y Semántico
Navegación por el documento
Transformación del documento
Generación de nuevos documentos XML
Como XML deriva de SGML desde el principio se dispuso de
herramientas
Toda la tecnología SGML es válida aquí
Ahora ya hay herramientas específicas para XML
Programación XML
Principales métodos:
Guiada por eventos: SAX
Basada en el recorrido del árbol: DOM
Enlaces (Bindings): JAXB
2
Programación XML
SAX: Modelos de eventos
SAX (Simple API for XML) es un analizador basado en eventos
Se define un modelo de eventos que se generan al analizar el documento XML
Esquema del
documento
Validación
Analizador
Sintáctico
Evento del analizador
Solicitud de datos
Lógica de
la aplicación
Documento
XML
Ejemplos de eventos generados
start document
start element: pizzas
start element: pizza
start element: ingrediente
end element: ingrediente
. . .
. . .
Procesamiento de XML
DOM: Modelos Basados en Árbol
DOM (Document Object Model)
Se genera un árbol a partir del documento XML
DOM = Interfaz que define cómo recorrer/modificar dicho árbol
Esquema del
documento
Árbol del
documento
Validación
Analizador
Sintáctico
Lógica de
la aplicación
Documento
XML
Problemas: Ficheros grandes
Solución: Deferred document (evaluación perezosa)
3
Procesamiento de XML
JAXB: Enlaces
JAXB: Java API for XML Binding
A partir del esquema del documento se generan clases de enlace
Permite trabajar con objetos de la aplicación
Generación automática de documentos válidos
Esquema del
documento
clases
enlace
Lógica de
la aplicación
Documento
XML
Modelo basado en eventos:
SAX
4
SAX
Creada por desarrolladores XML a partir de los comentarios en la lista
SAX: API simple para XML
xml-dev en 1998
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.
Los datos son los elementos asociados con el elemento identificado
SAX
Manejadores de contenido
Son los procedimientos que se invocan cuando se identifica un
elemento.
correspondiente.
El código solo se ejecuta cuando el analizador identifica el elemento
Esto permite no tener que cargar todo el documento en memoria.
Es la tecnología más eficiente de manipulación de documentos XML
Sobre todo para documentos muy extensos.
5
SAX
Manejadores de contenido
SAX define cuatro manejadores de contenido
Todos los demás los tiene que construir el programador de
la aplicación
SAX
Manejadores estándar
ContentHandler
XML
ErrorHandler
DTDHandler
permite manejar eventos relacionados con los datos de un documento
recibe información sobre errores en los datos del documento XML
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.
6
SAX
Manejadores de Contenido
Localizador de documento
Se llama siempre que ocurre un evento.
Permite conocer qué parte del documento XML se está analizando
(línea y columna)
Comienzo del documento:
startDocument()
Indica el comienzo del análisis.
Es el primero de todos los métodos que se llama.
Fin del documento:
endDocument()
Indica el fin del análisis.
Es el último de todos los métodos que se llama.
SAX
Manejadores de Contenido
Instrucciones de proceso
Son directivas para la aplicación que está trabajando con el documento
XML y no se consideran elementos XML
Cocoon las utiliza para indicar como presentar los datos una vez
analizados.
Informa del destino de la instrucción de proceso (target) y los datos
(data)
Espacio de nombres
Indica el comienzo y el fin de un espacio de nombres en el documento
XML
Informa del prefijo del espacio de nombres y de la URI asociada a ese
prefijo.
<alias:Elemento1 xmlns:alias=”http://mio.com”>
<alias:Elem2>HOLA</alias:Elem2>
</alias:Elemento1>
7
SAX
Manejadores de contenido
Elemento
Indica el inicio y el fin de un elemento XML
Informa del nombre del elemento y de los atributos que posee.
Permite recorrer los atributos mediante un bucle.
Los atributos pueden no estar ordenados.
Datos del elemento
Los elementos anidados dentro de otros elementos generan llamadas
recursivas hasta encontrar datos de tipo texto.
Informa de los datos mediante una matriz que contiene la información
extraída del documento XML
No está claramente especificado si los datos se devuelven todos de
una vez o mediante llamadas sucesivas.
SAX
Manejadores de errores
Sirve para tratar los errores que se puedan producir durante el análisis.
Cada llamada recibe la información a través de la excepción
SAXParseException
Contiene el número de línea.
La URI del documento XML que se está tratando.
Detalles de la excepción.
Mensaje explicativo.
Traza de la pila.
3 tipos: Avisos (warning), errores y errores fatales
8
SAX
Ejemplo:SimpleSAX
import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.apache.xerces.parsers.SAXParser;
public class SimpleSAX extends DefaultHandler {
public void startElement(String ns, String local, String qName, Attributes atts) {
System.out.println("startElement: " + local);
}
public static void main(String[] args) throws SAXException {
SimpleSAX s = new SimpleSAX();
SAXParser p = new SAXParser();
p.setContentHandler(s);
try {
p.parse(args[0]);
} catch (Exception e) {e.getMessage(); }}
}
SAX
ContentHandler
Principales métodos que define esta interfaz :
setLocator
setLocator
startDocument
startDocument
endDocument
endDocument
startElement
startElement
endElement
endElement
characters
characters
...etcétera
9
SAX
Locator
Proporciona una serie de métodos como getLineNumber y
getColumnNumber que permiten saber la ubicación actual en el
fichero XML donde tuvo lugar el último evento
Sólo tiene validez dentro de un ContentHandler
Se suele asignar a un atributo de la clase
Locator locator
locator;;
private Locator
private
public voidvoid setDocumentLocator(Locator
public
{{
}}
this.locator = = locator
locator;;
this.locator
setDocumentLocator(Locator locator
locator))
SAX
Principio y final de un documento
Se corresponden con los eventos startDocument y endDocument,
respectivamente
Son siempre el primer y el último método llamados, no sólo dentro
del ContentHandler, sino en el proceso de análisis completo
Incluso en la presencia de otros manejadores, como
DTDHandler
DTDHandler
10
SAX
Una nota sobre las excepciones
Muchos de los métodos de respuesta a eventos SAX, como los dos
anteriores, 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
Por ejemplo, si se procesa un documento a través de la red
y se produce una excepción de entrada/salida
(IOException)
A través del método getException
getException se puede acceder a la
excepción subyacente
SAX
Elementos
Hay tres eventos SAX que nos permiten acceder al contenido en sí del
documento analizado:
El principio y final de los elementos
elementos y el método characters
characters
startElement proporciona información sobre un elemento XML:
Nombre
Espacio de nombres, si lo hubiera
Atributos: En un objeto org.xml.sax.Attributes
org.xml.sax.Attributes
Similar a una lista o vector
endElement es muy similar al anterior, pero para el final del elemento
11
SAX
Contenido de un elemento
Una vez que hemos visto cómo saber el principio y fin de un
elemento y los atributos de éste, es necesario poder acceder al
contenido del mismo
Puede estar formado por elementos hijos, información textual, o una
combinación de ambos
A dicha información textual se accede mediante el método
characters, en forma de un array de caracteres
void characters(char[] ch, int start, int length)
SAX
Sobre el método characters
SAX no define cómo se devolverán grandes porciones de datos
textuales a través de este método
Puede ser en una única llamada, pero también podrían partirse
en varias invocaciones al método characters
characters
Y hay también que tener en cuenta el carácter secuencial del
procesamiento mediante SAX
¿Qué eventos tendrán lugar para el siguiente fragmento de
XML?:
<padre>EstoEsto eses<<hijohijo>¡>¡holahola!</!</hijohijo>un >un ejemplo
<padre>
ejemplo</padre>
</padre>
12
Sea el siguiente documento XML:
Ejemplo: videoclub.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<videoclub>
<pelicula titulo="2001: una odisea del espacio" año="1968" duracion="143">
…
</pelicula>
…
</videoclub>
<guionista>Stanley Kubrick</guionista>
<guionista>Arthur C. Clarke</guionista>
<guion>
</guion>
<direccion>
<director>Stanley Kubrick</director>
</direccion>
…
<sinopsis>"2001: Una Odisea del Espacio" es una cuenta atras hacia el futuro,
un mapa del destino humano, una conquista del infinito, un apasionante drama
sobre el hombre que lucha contra la maquina.</sinopsis>
</pelicula>
<pelicula titulo="Alien resurreccion" año="1998" duracion="105">
Ejemplo: videoclub.xml
Hacer un programa que muestre la siguiente información acerca de
cada película:
Título, año de rodaje y duración
Como esa información está disponible en los atributos del elemento
<pelicula>, bastará con redefinir el método startElement
13
Segundo ejemplo
Ahora, además de lo
Comentarios de: XML, Servicios Web y Web Semántica (0)
No hay comentarios