Este documento proporciona una introducción a las principales APIs de procesamiento XML en Java, incluyendo JAXP, DOM, SAX, StAX y JAXB. Explica sus características, casos de uso y cómo funcionan para leer, escribir y transformar documentos XML. También compara las ventajas e inconvenientes de cada API.
Guia Basica para bachillerato de Circuitos Basicos
Tema 3 xml processing ap is
1. Tema 3. XML
Processing APIs
Web Services 6.
Tema 3. XML Processing APIs 12/02/2013
1
2. Índice
1. JAXP
1.1 SAX 2
1.2 DOM 2
1.3 XSLT
1.4 StAX
2. JAXB
2.1 XML-to-Java
2.2 Java-to-XML
2.3 SAAJ
Tema 3. XML Processing APIs 12/02/2013
2
3. 3.1. JAXP
Introducción
• Java API for XML Processing (JAXP) se utiliza para el
procesamiento de datos XML.
• Utiliza
• SAX (Simple API for)
• DOM (Document Object Model
• Compatilbe con el estándar eXtensible Stylesheet Language
Transformations (XSLT)
• proporciona soporte para namespaces -> DTDs
• A partir de la versión 1.4, implementa el estándar Streaming
API for XML (StAX).
Tema 3. XML Processing APIs 12/02/2013
3
4. 3.1.1 SAX
Introducción
• Arquitectura basada en eventos.
• Un analizador SAX lee un XML como un flujo de datos.
• Según va leyendo envía eventos a un objeto de una clase que
implemente la interfaz SAX.
• Utiliza varias interfaces, como ContentHandler
Tema 3. XML Processing APIs 12/02/2013
4
5. 3.1.1 SAX
Eventos I
• startDocument()
• Evento producido al empezar el documento.
• endDocument()
• Evento producido al finalizar el documento.
• startPrefixMapping(String prefix, String uri)
• Empieza la lectura de un prefijo.
• endPrefixMapping(String prefix)
• Finaliza la lectura de un prefijo.
• startElement(String uri, String localName, String qName, Attributes
atts)
• Empieza la lectura de un elemento. Los parámetros que recibe son:
• uri: URI del espacio de nombres al que pertenece el elemento.
• localName: nombre del elemento sin el prefijo.
• qName : nombre completo del elemento, es decir, el prefijo más el
localName.
• atts: conjunto de atributos del elemento.
Tema 3. XML Processing APIs 12/02/2013
5
6. 3.1.1 SAX
Eventos y II
• endElement(String uri, String localName, String qName)
• Finaliza la lectura de un elemento
• characters(char[] ch, int start, int length)
• Lectura del contenido de un elemento. Recibe un array de chars con
una posición inicial y la longitud.
• ignorableWhitespace(char[] ch, int start, int length)
• Evento lanzado cuando se leen un character en blanco que se puede
ignorar
• processingInstruction(String target, String data)
• Evento lanzado al procesar una instrucción
• skippedEntity(String name)
Tema 3. XML Processing APIs 12/02/2013
• Tiene lugar en algunos analizadores que se saltan
las entidades cuando no están validando, pero es difícil encontrar
casos así. 6
7. 3.1.1 SAX
Como parsear un XML con SAX.
XMLReader reader = XMLReaderFactory.createXMLReader();
ContentHandler handler = new MiHandler();
reader.setContentHandler(handler);
reader.parse(ARCHIVO_XML);
Tema 3. XML Processing APIs 12/02/2013
7
8. 3.1.2 DOM
Introducción
• Conjunto de clases e interfaces que modela XML como un
árbol de objetos(nodos).
• Cuando DOM analiza un documento XML, lee el contenido y
construye un grafo de objetos que refleja la estructura del
XML.
Tema 3. XML Processing APIs 12/02/2013
8
9. 3.1.2 DOM
Elementos
• Cada elemento en el documento XML se representa mediante
una instancia de tipo Element.
• Cada uno de los componentes XML tiene su correspondiente tipo
DOM. Su supertipo común es la interfaz org.w3c.dom.Node.
• atributos - Attr
• comentarios – Comment
• texto - Text, secciones CDATA a CDATASection, y así sucesivament
• Cuando un parseador DOM procesa un documento XML con
éxito, devuelve un objeto org.w3c.dom.Document.
• Document proporciona acceso al elemento raíz, que a su vez da
acceso a todos los elementos
Tema 3. XML Processing APIs 12/02/2013
9
10. • Utiliza DocumentBuilderFactory y DocumentBuilder.
• Estas clases proporcionan abstracciones para los parseadores
DOM y cómo proporcionarles documentos XML.
• DocumentBuilderFactory es una factoría utilizada para crear
parseadores DOM.
• devuelve una instancia de DocumentBuilder, que representa el
parseador, mediante su método el
DocumentBuilderFactory.newInstance().
• En el caso de querer crear un documento utilizamos
DOMImplementation,.
• Se obtiene con DocumentBuilder
• Prepara el nuevo Document con el nombre cualificado y el
espacio de nombres XML del Element raíz.
Tema 3. XML Processing APIs 12/02/2013
10
3.1.2 DOM
Como parsear un XML (I)
11. 3.1.2 DOM
Como parsear un XML (II)
DocumentBuilder builder factory.newDocumentBuilder = ();
DOMImplementation domImpl builder.getDOMImplementation = ();
Documento xmlDoc domImpl.createDocument = (SOAP_NS, "soap:
Envelope", null);
Element root = xmlDoc.getDocumentElement();
• Una vez obtenido root podemos empezar a añadirle otros
elementos.
Tema 3. XML Processing APIs 12/02/2013
11
12. • Tipo de dato primario de DOM.
• Representa un nodo en el árbol del documento
• Posee estas constantes que indican el tipo de nodo:
• public static final short ATTRIBUTE_NODE;
• public static final short CDATA_SECTION_NODE;
• public static final short COMMENT_NODE;
• public static final short DOCUMENT_FRAGMENT_NODE;
• public static final short DOCUMENT_NODE;
• public static final short DOCUMENT_TYPE_NODE;
• public static final short ELEMENT_NODE;
• public static final short ENTITY_NODE;
• public static final short ENTITY_REFERENCE_NODE;
• public static final short NOTATION_NODE;
• public static final short PROCESSING_INSTRUCTION_NODE;
Tema 3. XML Processing APIs 12/02/2013
12
3.1.2 DOM
La interfaz Node
13. 3.1.2 DOM
La interfaz Node. Métodos. (I)
• Métodos que dependen del tipo de nodo
• getNodeType (): Nos indica el tipo de nodo.
• Node.getNodeName() y Node.getNodeValue(): Nos
devuelven diferentes valores en función de la siguiente tabla.
Tema 3. XML Processing APIs 12/02/2013
13
Interface nodeName nodeValue
Attr name of attribute value of attribute
CDATASection "#cdata-section" content of the CDATA Section
Comment "#comment" content of the comment
Document "#document" null
DocumentFragment "#document-fragment"
null
DocumentType document type name null
Element tag name null
Entity entity name null
EntityReference name of entity
referenced
null
Notation notation name null
ProcessingInstructio
n
target entire content excluding the
target
Text "#text" content of the text node
14. • Metodos de nombres XML
• Sólo se asignan nombres XML a los tipos Element y Attr.
• getLocalName()
• getNamespaceURI
• getPrefix()
• setPrefix()
• Métodos para los atributos
• hasAttributes(): devuelve true si el nodo tiene atributos. solo los nodos
Element devolverán true; el resto false.
• getAttributes(): devuelve un mapa de los atributos de un elemento
específico, junto con sus valores
Tema 3. XML Processing APIs 12/02/2013
14
3.1.2 DOM
La interfaz Node. Métodos. (II)
15. • Metodos para navegar
• getParent(): devueleve el padre de un elemento. Puede ser otro
elemento o, en el caso del elemento raíz, un documento.
• getPreviousSibling() o getNextSibling(): devuelve el hermano
anterior o siguiente. (Nodos que comparten padre)
• getChildNodes(): devuelve la lista de nodos hijos en un NodeList.
• getLastChild(): devuelve el ultimo hijo
• getFirstChild().: devuelve el primer hijo.
Tema 3. XML Processing APIs 12/02/2013
15
3.1.2 DOM
La interfaz Node. Métodos. (III)
16. • Metidos de gestión de hijos.
• appendChild() agrega un nodo al final de la lista de hijos de un
Node.
• insertBefore(): inserta un nuevo nodo en la lista de hijos justo
antes del hermano designado.
• removeChild() elimina el nodo del árbol
• replaceNodes() reemplaza un nodo a otro.
• no se puede asignar a un objeto de otro documento.
• No son visibles en el árbol, pero son todavía propiedad del mismo
documento.
Tema 3. XML Processing APIs 12/02/2013
16
3.1.2 DOM
La interfaz Node. Métodos. (IV)
17. • API de parseo por “pull” del flujo XML, orientada a
eventos, capaz de leer y escribir XML.
• “pull” significa que es la clase manejador (handle) llama al
parseador, y no al revés. En otras palabras, el manejador de "tira"
de los eventos XML del analizador.
• Se puede detener el análisis en cualquier momento.
• StAX es más simple que SAX y también tiene una gestión de
memoria más eficiente que DOM.
• Stax se combina de dos APIs diferentes: API cursor y API
iterator.
Tema 3. XML Processing APIs 12/02/2013
17
3.1.3 StAX
Introducción.
18. • Representa un cursor con el que se puede recorrer un documento XML.
• Siempre se mueve hacia adelante, nunca hacia atrás.
• Utiliza XMLStreamReader y XMLStreamWriter.
• XMLStreamReader incluye métodos para acceder a toda la información posible del XML
public interface XMLStreamReader {
public int next() throws XMLStreamException;
public boolean hasNext() throws XMLStreamException;
public String getText();
public String getLocalName();
public String getNamespaceURI();
// ... other methods not shown
}
• XMLStreamWriter
public interface XMLStreamWriter {
public void writeStartElement(String localName) throws XMLStreamException;
public void writeEndElement() throws XMLStreamException;
public void writeCharacters(String text) throws XMLStreamException;
// ... other methods not shown
}
• La API cursor tiene cierto parecido con SAX.
• dispone de métodos para acceder directamente al flujo de caracteres.
• Los métodos de la API devolven información XML como string, lo que minimiza los requisitos de
memoria.
Tema 3. XML Processing APIs 12/02/2013
18
CURSOR API
3.1.3 StAX
API Cursor
19. • Representa un flujo de un documento XML como un
conjunto discreto de eventos.
• Estos eventos son lanzados por el parseador en el orden en que se leen
del XML.
• El evento base se denomina XMLEvent, existiendo
subinterfaces para cada tipo de evento.
• XMLEventReader: XMLEventReader contiene cinco métodos, el
más importante es nextEvent(). implementa java.util.Iterator
• XMLEventWriter. Implementa java.util.Iterator.
Tema 3. XML Processing APIs 12/02/2013
19
3.1.3 StAX
API Iterator
20. • Cosas que se pueden hacer con iterator y no con cursor:
• Los objetos creados a partir de las subclases XMLEvent son
inmutables, y pueden ser utilizados en arrays, listas y mapas, y puede
transmitirse a través de la aplicación, incluso después de que el
parser haya azanzado a eventos posteriores.
• Se puede crear subtipos de XMLEvent que, o sean completamente
nuevos, o ampliaciones de elementos existentes, pero con métodos
adicionales.
• Se puede agregar y quitar eventos de una secuencia de eventos XML
de una manera mucho más simple que con la API cursor.
• Recomendaciones generales
• Si el rendimiento es una prioridad importante, la API cursor es más
eficiente.
• Si desea crear flujos de procesamiento de XML, utilice la API iterator.
• Si desea modificar la secuencia de eventos, utilice la API iterator.
• En general se recomienda utilizar la API de iterator porque es más
flexible y extensible.
Tema 3. XML Processing APIs 12/02/2013
20
3.1.3 StAX
Comparativa
21. • Define
• una gramática: hojas estilo XSLT
• reglas de procesado para el mapeo de documentos en un formato
a documentos en otro formato.
• Lo importante de XSLT es quedarnos con que permite la
escritura de datos XML en un archivo, convertir datos
XML a otros formatos y, junto con SAX, la conversión de
los datos heredados a XML.
Tema 3. XML Processing APIs 12/02/2013
21
3.1.4 XSLT
Introducción
22. Comparativa
Feature StAX SAX DOM
API Type Pull, streaming Push, streaming In memory tree
Ease of Use High Medium High
XPath Capability No No Yes
CPU and Memory Efficiency Good Good Varies
Forward Only Yes Yes No
Read XML Yes Yes Yes
Write XML Yes No Yes
Create, Read, Update, Delete No No Yes
Tema 3. XML Processing APIs 12/02/2013
22
23. • Mapear XML a objetos y cargarlos en memoria
• Este mapeo se realiza de acuerdo a un esquema.
• Generar clases que representan elementos de un XML
• Desarrolladores no tienen que escribir los objetos
• Básicamente nos permite realizar las operaciones que se
muestran a continuación:
• Con JAXB ya no tenemos que aprender lo que nos ha
explicado Chema de SAX y DOM. Lo siento Chema!!
Tema 3. XML Processing APIs 12/02/2013
23
3.1.4 JAXB
¿XML BINDING?
24. • Crear/Leer/Modificar XML
• Validar entradas de usuario basado en las restricciones
impuestas en un XML schema.
Tema 3. XML Processing APIs 12/02/2013
24
3.1.4 JAXB
CASOS DE USO
25. • Dado un Schema “hello.xsd”
• Ejecutamos comando xjc –p hello hello.xsd -p para
indicar el directorio de destino hello
Tema 3. XML Processing APIs 12/02/2013
25
3.1.4 JAXB
HELLO WORLD
26. • Clases generadas
Tema 3. XML Processing APIs 12/02/2013
26
3.1.4 JAXB
HELLO WORLD
27. • Usar las clases y obtener resultado
Tema 3. XML Processing APIs 12/02/2013
27
3.1.4 JAXB
HELLO WORLD
28. • Con las anotaciones defines el XML Schema
Tema 3. XML Processing APIs 12/02/2013
28
3.1.4 JAXB
EJEMPLO CON ANOTACIONES
29. • Objeto a XML
Tema 3. XML Processing APIs 12/02/2013
29
3.1.4 JAXB
EJEMPLO CON ANOTACIONES
30. • XML a Objeto
Tema 3. XML Processing APIs 12/02/2013
30
3.1.4 JAXB
EJEMPLO CON ANOTACIONES
31. Tema 3. XML Processing APIs 12/02/2013
31
3.1.4 JAXB
EJEMPLO CON ANOTACIONES
32. Tema 3. XML Processing APIs 12/02/2013
32
3.1.4 JAXB
SAAJ
• API que permite la construcción y lectura de mensajes SOAP
• Es una API de más bajo nivel que JAX-RPC y JAX-WS
• Permite el envío de adjuntos en el mensaje SOAP. Una imagen
jpg por ejemplo.
33. Tema 3. XML Processing APIs 12/02/2013
33
3.1.4 JAXB
SAAJ -Mensaje SOAP sin adjuntos
34. Tema 3. XML Processing APIs 12/02/2013
34
3.1.4 JAXB
SAAJ -Mensaje SOAP con adjuntos
35. Tema 3. XML Processing APIs 12/02/2013
35
3.1.4 JAXB
SAAJ - CREANDO UN MENSAJE SOAP
• CLASE: javax.xml.soap.MessageFactory
• Resultado:
• Acceder a los elementos del mensaje
• A través del objeto SOAPEnvelope(javax.xml.soap)
• A través del objeto SOAPMessage
36. Tema 3. XML Processing APIs 12/02/2013
36
3.1.4 JAXB
SAAJ - CREANDO UN MENSAJE SOAP
• CLASE: javax.xml.soap.MessageFactory
• Resultado:
• Acceder a los elementos del mensaje
• A través del objeto SOAPEnvelope(javax.xml.soap)
• A través del objeto SOAPMessage
37. Tema 3. XML Processing APIs 12/02/2013
37
3.1.4 JAXB
SAAJ - CREANDO UN MENSAJE SOAP
• Añadir elemento al Body del mensaje
• Resultado:
38. Tema 3. XML Processing APIs 12/02/2013
38
3.1.4 JAXB
SAAJ - CREANDO UNA CONEXIÓN PARA EL
MENSAJE SOAP
connection.close();
• Recuperar el mensaje
while (iterator.hasNext())
{
SOAPBodyElement bodyElement =(SOAPBodyElement)iterator.next();
String lastPrice = bodyElement.getValue();
System.out.print("The last price for SUNW is ");
System.out.println(lastPrice);
}
39. Tema 3. XML Processing APIs 12/02/2013
39
3.1.4 JAXB
SAAJ - CREANDO UN MENSAJE SOAP
• Añadir elemento al Body del mensaje
• Resultado:
40. Tema 3. XML Processing APIs 12/02/2013
40
3.1.4 JAXB
SAAJ - AÑADIENDO ADJUNTOS AL MENSAJE
SOAP
• Se puede añadir cualquier contenido
• Añadiendo una imagen: