java y xml sesión 1: introducción a xml y sax · java y xml copyright © 2004-2005 universidad de...

26
Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 1 Java y XML Sesión 1: Introducción a XML y SAX Especialista en Aplicaciones y Servicios Web con Java Enterprise

Upload: others

Post on 26-Oct-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 2: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 3: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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>

Page 4: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 5: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 6: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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• < &lt;• > &gt;• & &amp;• <![CDATA[ … ]]>

Page 7: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 8: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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 >

Page 9: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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>

Page 10: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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 >

Page 11: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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>

Page 12: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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)

Page 13: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 14: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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()

Page 15: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 16: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 17: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 18: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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()

Page 19: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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"); }

Page 20: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 21: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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); }

Page 22: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 23: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 24: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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>

Page 25: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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

Page 26: Java y XML Sesión 1: Introducción a XML y SAX · Java y XML Copyright © 2004-2005 Universidad de Alicante Introducción a XML y SAX 5

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