saxl.doc

Upload: ines-garcia

Post on 04-Oct-2015

13 views

Category:

Documents


0 download

TRANSCRIPT

Java y XML: SAX (I)

Java y XML: SAX (I)

Tras lo comentado en el postJava y XML, me gustara centrar la atencin sobre el parseadorSAX(Simple API for XML). Lo comento porque SAX fue el primer parseador de XML adoptado como API para XML en Java. Como se podr ver a lo largo del post, SAX deja mucho que desear con respecto a otras APIs para XML como las basadas en DOM.

Como dije en el post anterior, SAX es un parseador de acceso serie y basado en eventos. Es decir, va recorriendo el xml poco a poco (en serie) y va generando eventos conforme va encontrando determinadas partes del xml, como el principio de etiquieta, el fin de etiqueta, texto, ....

A continuacin expongo un ejemplo de uso de SAX. Se trata de dos clases:ManejadorEjemployProcesaXML.

ManejadorEjemplo

Setrata de la clase que va a procesar cada evento que lance el procesador SAX. Basta con heredar del manejador por defecto de SAXDefaultHandlery sobreescribir los mtodos correspondiente a los eventos deseados. En este caso he sobreescrito los ms comunes: startDocument: se produce al comenzar el procesado del documento xml. endDocument: se produce al finalizar el procesado del documento xml.

startElement: se produce al comenzar el procesado de una etiqueta xml. Es aqu donde se leen los atributos de las etiquetas.

endElement: se produce al finalizar el procesado de una etiqueta xml.

characters: se produce al encontrar una cadena de texto.

Cada vez que el parseador encuentre una etiqueta se va a llamar astartElement. Sea la etiqueta que sea. Recibiremos como parmetro el nombre de la etiqueta pero no la etiqueta padre. Por tanto si tenemos etiquetas anidadas con el mismo nombre, debemos almacenar en un objeto persistente (al menos durante el procesado del documento xml) la ruta de etiquetas por la que vamos procesando. Es decir, un objeto que almacene el de estado en que se encuentra el procesado del documento.

Esteinconvenientese acenta al leer los valores de las etiquetas ya que al mtodocharactersse llama sin indicar elelemental que se est accediendo. Para saber a qu etiqueta pertenece el texto debamos haberlomarcadopreviamente al pasar por elstartElementcorrespondiente. En este caso es imprescindible el objeto que nos marca el estado.

Por este tipo de cosas digo que este API es arcano y anticuado. Cuando veamos DOM, veremos que se puede tener acceso aleatorio a cualquier parte del documento XML, lo cul nos evita toda esta parafernalia.

ManejadorEjemplo.javaview plain

HYPERLINK "http://www.latascadexela.es/2008/07/java-y-xml-sax.html" copy to clipboard

HYPERLINK "http://www.latascadexela.es/2008/07/java-y-xml-sax.html" print

HYPERLINK "http://www.latascadexela.es/2008/07/java-y-xml-sax.html" ?1. packagees.latascadexela.xml.sax;2. 3. importorg.xml.sax.Attributes;4. importorg.xml.sax.SAXException;5. importorg.xml.sax.helpers.DefaultHandler;6. 7. /**8. *ManejadordeeventosSAXdeejemplo.9. *10. *@authorXela11. *12. */13. publicclassManejadorEjemploextendsDefaultHandler{14. 15. @Override16. publicvoidstartDocument()throwsSAXException{17. System.out.println("\nPrincipiodeldocumento...");18. }19. 20. @Override21. publicvoidendDocument()throwsSAXException{22. System.out.println("\nFindeldocumento...");23. }24. 25. @Override26. publicvoidstartElement(Stringuri,StringlocalName,Stringname,27. Attributesattributes)throwsSAXException{28. System.out.println("\nProcesandoetiqueta...");29. System.out.println("\tNamespaceuri:"+uri);30. System.out.println("\tNombre:"+localName);31. System.out.println("\tNombreconprefijo:"+name);32. 33. //Recorremoslosatributos34. System.out.println("\tProcesando"+attributes.getLength()+"atributos...");35. for(inti=0;i