java y xml sesión 1: introducción a xml y sax · java y xml copyright © 2004-2005 universidad de...
TRANSCRIPT
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 1
Java y XMLSesión 1:
Introducción a XML y SAX
Especialista en Aplicaciones y ServiciosWeb con Java Enterprise
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 2
Índice
Conceptos básicos sobre XML-Java Estructura de un documento XML Funcionamiento de SAX. Ejemplo Estructura de un analizador SAX SAX y Java: JAXP Eventos SAX. Ejemplos
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 3
Forma de definir lenguajes de marcado
Usos Exportación-Importación de datos, multisistema-multiplataforma Formato neutro transformable al deseado: HMTL, PDF,.. Ficheros de configuración legibles por usuario-máquina
XML. Usos
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><novedades> <fecha>2004-01-01</fecha> <disco genero="pop" cod="1111"> <titulo>O sea</titulo> <interprete>Enrique Iglesias</interprete> <direccion>http://www.enriqueiglesias.com</direccion> </disco></novedades>
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 4
Java y XML
APIs incluidos en Java 2JAXP (Java API for XML Processing): análisis y
procesamiento de ficheros XML• SAX• DOM• XSLT (transformación)
APIs incluidos en el JWSDP (Java Web ServicesDeveloper Pack)JAXB (Java API for XML Binding): transformación
entre XML y JavaSAAJ, JAX-RPC, JAXR: servicios web
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5
<?xml version="1.0" standalone="no" ?><?xml-stylesheet type="text/css" href="a.css"?><!DOCTYPE novedades SYSTEM "novedades.dtd"><novedades> <fecha>Enero 2004</fecha> <disco genero="pop"> <titulo>O sea</titulo> <interprete>Enrique Iglesias</interprete> </disco> <libro> <titulo>Aplicaciones web</titulo> <autor>John McCarra</autor> <autor>Frank Webini</autor> </libro></novedades>
Estructura de un documento XML
Declaración XMLInstrucción de proc. (PI)DOCTYPEElemento raíz
Subelementos
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 6
Documento XML bien formado
Cumple unas “normas básicas” de sintaxisTodas las etiquetas deben cerrarseSe distingue entre mayúsculas y minúsculasLos atributos deben estar entre comillasDebe haber un único elemento raízUtilizar entidades predefinidas para caracteres
reservados• < <• > >• & &• <![CDATA[ … ]]>
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 7
Documento XML válido
Está bien formado y además cumple la gramáticaespecificada por el usuario (o quien haya definidoel lenguaje)
Lenguajes de definición de gramáticas para XMLDTD: poco potente, amplio soporte en softwareSchema: más potente, más “novedoso”, menos soporte
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 8
Ejemplo DTD: definición de elementos
<!ELEMENT myml (head? , body) ><!ELEMENT head (title , (meta | link)* ) ><!ELEMENT title (#PCDATA) ><!ELEMENT body (p)* ><!ELEMENT p (#PCDATA | ul | br)* ><!ELEMENT ul (li)+ ><!ELEMENT li (#PCDATA | ul | br)* ><!ELEMENT br EMPTY ><!ELEMENT meta EMPTY ><!ELEMENT link EMPTY >
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 9
Ejemplo DTD: definición de elementos
<myml><head> <title>A document</title></head><body> <p>Course options: <ul> <li>Some text</li> <li>A<br/>line break</li> </ul> </p></body></myml>
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 10
Ejemplo DTD: definición de atributos
<!ELEMENT person (name)+ ><!ELEMENT name (#PCDATA) ><!ATTLIST person ssn ID #REQUIRED spouse IDREF #IMPLIED friends IDREFS #IMPLIED profession NMTOKEN "student" employer CDATA #FIXED "osu" ><!ATTLIST name type (first | middle | last) #IMPLIED >
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 11
Ejemplo DTD: definición de atributos
<person ssn="n123456789" employer="osu" > <name>Me</name> <name type="first">Alone</name></person>
<person ssn="n012345678" employer="osu" > <name>You</name> <name type="first">Fun</name></person>
<person ssn="n987654321" spouse="n123456789" friends="n123456789 n012345678" employer="osu" > <name type="first">One</name> <name>Some</name></person>
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 12
Definición de SAX
SAX: Simple API for XML Es un API para analizar documentos XML Originalmente se diseñó únicamente para Java Está basado en eventos:
Los eventos se asocian con el inicio y final de elementos deun documento XML
El analizador informa de los eventos directamente a laaplicación mediante llamadas a los manejadores de eventoscorrespondientes (callbacks)
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 13
Funcionamiento de SAX
A medida que el analizador recorre el documentoXML informa de la ocurrencia de eventos
Sigue una filosofía similar a AWTExisten objetos que pueden emitir eventos (elementos del
documento XML)Existen objetos oyentes (listeners) que manejan los eventos
Realiza un análisis secuencial del documento XMLNo se pueden determinar relaciones padre/hijo, esto es
responsabilidad del programador
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 14
Ejemplo de funcionamiento
Documento de entrada:
<?xml version="1.0"encoding="ISO-8859-1"standalone="yes"?>
<documentoXML><cabecera> Esto es un
documento XML </cabecera>Eso es todo amigos</documentoXML>
Resultado del análisis:
startDocument()startElement(): documentoXMLstartElement(): cabeceracharacters(): Esto es un
documento XMLendElement(): cabeceracharacters(): Eso es todo amigosendElement(): documentoXMLendDocument()
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 15
Estructura de un analizador SAX
Interfaz ContentHandler Especifica los manejadores de eventos que debemos implementar La clase DefaultHandler incorpora manejadores de eventos por defecto
(vacíos) para todos los eventos Interfaces ErrorHandler, EntityResolver y DTDHandler
Tratan errores, entidades y DTDs Interfaz XMLReader
Contiene los métodos para analizar el documento y generar los eventos SaxException
Tiene clases descendientes que representan los distintos tipos de errores
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 16
SAX y Java
Hay varias implementaciones de SAXLa más conocida es la de Xerces (del proyecto Apache)
La forma de instanciar un parser SAX no estáespecificada, y depende de la implementaciónempleadaJAXP: Java API for XML Processing (de Sun) permite
trabajar con XML y Java independientemente de laimplementación del parser utilizada
JAXP está dividido en dos partes:• API de análisis• API de transformación
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 17
Utilizando JAXP
JAXP RI (JAXP Reference Implementation)Cubre todo el API: análisis + transformaciónVersión actual 1.2.0
Ejemplo:import java.io.FileReader;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.helpers.DefaultHandler;public class EjemploSax { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(args[0], new DefaultHandler()); }}
encapsula una implementaciónde un analizador SAX
entrada a analizar manejador de eventos
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 18
Eventos SAX
La interfaz DefaultHandler gestiona (por defecto)todos los eventos:
startDocument() y endDocument() startElement() endElement() characters() ignorableWhitespace() startPrefixMapping() y endPrefixMapping()
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 19
Ejemplo: Imprime mensajes de los eventos
import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;
public class SAXParserHandler extends DefaultHandler {
//comienzo del documento public void startDocument() throws SAXException { System.out.println("startDocument"); }
//fin del documento public void endDocument() throws SAXException { System.out.println("endDocument"); }
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 20
Ejemplo: Imprime mensajes de los eventos
//texto dentro de etiquetas public void characters(char[] ch, int start, int length) throws SAXException {
String charString = new String(ch, start, length); System.out.println("caracteres: " + charString); }
//etiqueta de apertura, puede contener atributos public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { System.out.println("startElement: " + qName); // Lista atributos y sus valores for (int i=0; i<atts.getLength(); i++) { System.out.println("Atributo: " + atts.getLocalName(i)); System.out.println("\tValor: " + atts.getValue(i)); } }
nombre xml
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 21
Ejemplo: Imprime mensajes de los eventos
//etiqueta de cierre public void endElement(String nameSpaceURI, String localName, String qName) throws SAXException { System.out.println("endElement: " + qName); }
//espacio en blanco que se puede ignorar public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { System.out.println(length + " caracteres en blanco ignorables"); }
//comienzo de espacio de nombres public void startPrefixMapping(String prefix, String uri) throws SAXException { System.out.println("Comienza prefijo de namespace: " + prefix); }
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 22
Ejemplo: Imprime mensajes de los eventos
//fin de espacio de nombres public void endPrefixMapping(String prefix) throws SAXException { System.out.println("Termina prefijo de namespace: " + prefix); }
//instrucción de procesamiento public void processingInstruction(String instruction, String data) throws SAXException { System.out.println("Instrucción: " + instruction + ", datos: " + data); }
//entidad que no se desea resolver, por lo que se ignora public void skippedEntity(String name) throws SAXException { System.out.println("Entidad saltada: " + name); }
} //fin SAXParserHandler
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 23
Espacios en blanco
Por defecto se consideran significativos El evento ignorableWithespace no se produce
Ejemplo fichero entrada:
<?xml version="1.0"?><prueba> <uno>Una prueba simple </uno></prueba>
Fichero de salida generado:startDocumentstartElement: pruebacaracteres:startElement: unocaracteres: Una prueba simpleendElement: unocaracteres:endElement: pruebaendDocument
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 24
Espacios en blanco y validación
Para que el analizador distinga entre espacios significativos yno significativos es necesario definir una gramática y validarel documento con ella Se utiliza el método setValidating de SAXParserFactory con
el argumento true
Ejemplo gramática DTD:
//fichero "prueba.dtd"<!ELEMENT prueba (uno)><!ELEMENT uno (#PCDATA)>
Documento XML con el DTD://modificación al documento XML<?xml version="1.0"?><!DOCTYPE prueba SYSTEM "prueba.dtd"><prueba> <uno>Una prueba simple</uno></prueba>
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 25
Localización de eventos
Se puede saber cuándo se ha producido un evento utilizando la claseLocator Métodos getLineNumber() y getColumnNumber()
Ejemplo://Añadimos a la clase SAXParserHandler
import org.xml.sax.Locator; ...
public void setDocumentLocator(Locator locator) { this.locator = locator;
}
se define un objetoLocator
el parser utiliza el objetoLocator que se pasa por
parámetro
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 26
Gestión de errores
Utilizamos una clase que implemente ErrorHandler podemos utilizar DefaultHandler
Métodos para gestionar los errores: fatalError() error() warning()
Ejemplo:
//Añadimos a la clase SAXParserHandlerimport org.xml.sax.SAXParseException;...public void fatalError(SAXParseException e) throws SAXException {
System.out.println("Error fatal " + e);}
los tres tienen como argumentoun objeto de la claseSAXParseException