tutorial read parser example ejemplo java xml sax

read - sax xml java example



Generando XML usando SAX y Java (6)

A continuación se responde "un buen tutorial para escribir XML usando el analizador SAX y Java" parte de la pregunta

No estoy seguro si has pasado por esto. Pero realmente me gusta el índice realmente grande de todo de Java .

Ir a través de este: http://download.oracle.com/javase/tutorial/jaxp/index.html

Y, finalmente, esto: http://download.oracle.com/javase/tutorial/jaxp/sax/index.html

¿Alguien sabe de un buen tutorial (o tiene un buen ejemplo) para escribir XML utilizando el marco SAX (o algo similar) y Java? La búsqueda ha dado muy poco en términos de resultados útiles. Estoy tratando de exportar desde una aplicación de Android y busco evitar la sobrecarga de memoria posible.


Consulte la publicación de mi blog personal: Generación XML en Java , específicamente, el método SAX . Hace referencia a algunos otros artículos relacionados con esto, proporciona un ejemplo concreto y compara SAX con las otras API populares para generar XML desde Java.

(Comprendió que esta es una pregunta más antigua, pero sintió que era necesario agregarla a cualquier otra persona que pudiera tener la misma pregunta).


El análisis de SAX es para leer documentos, no para escribirlos.

Puedes escribir XML con XMLStreamWriter:

OutputStream outputStream = new FileOutputStream(new File("doc.xml")); XMLStreamWriter out = XMLOutputFactory.newInstance().createXMLStreamWriter( new OutputStreamWriter(outputStream, "utf-8")); out.writeStartDocument(); out.writeStartElement("doc"); out.writeStartElement("title"); out.writeCharacters("Document Title"); out.writeEndElement(); out.writeEndElement(); out.writeEndDocument(); out.close();


Existe una técnica muy útil para generar XML directamente desde POJOs a través del marco SAX (no un analizador SAX, sino el marco SAX). Esta técnica podría ser utilizada para generar un documento XML .

Generando XML desde una estructura de datos arbitraria
http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT5.html

Esencialmente, agregue métodos a su POJO o escriba la clase de utilidad para sus POJO que los conviertan en emisores de eventos SAX (la emisión de eventos como un analizador SAX normalmente lo haría al analizar un documento XML). Ahora su "generador de eventos SAX" se ve como el lado de salida de un analizador de SAX y se le puede dar cualquier controlador de contenido que un analizador de SAX tomaría, como uno que imprime XML. Pero también podría ser una fuente para un analizador DOM para generar un árbol DOM o una fuente para un motor XSLT para generar HTML o hacer una verdadera traducción XSL sin tener que generar primero un documento XML intermedio desde los POJO.

Por ejemplo, una clase de persona podría tener un método emitXML() que incluya estas líneas:

handler.startElement(nsu, PERSON_TAG, PERSON_TAG, NO_ATTRIBUTES); handler.startElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG, atts); handler.characters(this.firstName.toCharArray(), 0, this.firstName.length()); handler.endElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG); ... emit more instance variables ... emit child object like: homeAddress.emitXML(handler, ...); handler.endElement(nsu, PERSON_TAG, PERSON_TAG);

Actualizar:

Un par de otras referencias:

Un par de respuestas a los comentarios:

Esto es cierto, pero la interfaz XMLStreamWriter descrita anteriormente es mucho más fácil de usar. - Michael Kay hace 3 horas

Sí, pero supongo que no estaba claro. XMLStreamWriter podría atravesar la jerarquía y usar XMLStreamWriter para XMLStreamWriter directamente un documento XML a una secuencia. Sin embargo, los artículos muestran una poderosa técnica para atravesar la jerarquía y generar eventos SAX, en lugar de generar un documento XML directamente. Ahora puedo conectar diferentes controladores de contenido que hacen cosas diferentes o generan diferentes versiones de XML. También podríamos alimentar nuestra jerarquía de objetos a cualquier herramienta que acepte un analizador SAX, como un motor XSLT. En realidad, solo estamos aprovechando el patrón de visitantes establecido por el marco SAX: separamos atravesando la jerarquía de la salida del XML. Las partes que generan el XML, los controladores de contenido, deben utilizar un XMLStreamWriter si su propósito es escribir una secuencia XML.

Por ejemplo, en nuestro programa, enviamos mensajes XML a través de sockets de red entre componentes distribuidos y también usamos XSLT para generar nuestras páginas HTML. Anteriormente, atravesábamos nuestra jerarquía para generar un documento XML (una cadena) y luego escribíamos ese documento XML en un socket de la red o lo introducíamos en el motor XSLT (que esencialmente lo analizaba nuevamente). Después de usar esta técnica, esencialmente podríamos alimentar nuestra jerarquía de objetos (usando este adaptador SAX) directamente al motor XSLT sin necesidad de la cadena XML intermedia. También fue conveniente poder usar un controlador de contenido para generar una representación compacta de XML para el flujo de red y usar uno diferente para generar un documento XML bastante impreso para escribir en un archivo de registro.

Además, el uso de la API del analizador SAX para escribir XML es un uso incorrecto de la API, IMHO. - Puce hace 49 min.

Quizás, pero creo que depende de tus necesidades. Si el requisito de OP es simplemente escribir un documento XML específico, entonces esto es definitivamente excesivo. Sin embargo, pensé que vale la pena mencionar si el OP utiliza XML de otras formas en su proyecto que él no mencionó. No hay nada malo en lanzar una idea alternativa.

Llamarlo mal uso puede ser un poco fuerte, pero estoy de acuerdo en que tiene derecho a su opinión. Está documentado en un tutorial de Oracle, por lo que no se considera abuso por parte de los ingenieros de Sun / Oracle. Fue un gran éxito en nuestro proyecto para ayudarnos a cumplir nuestros requisitos sin inconvenientes significativos, por lo que mantendré este enfoque en mi caja de herramientas para cuando sea útil en el futuro.


También considere JAXB para escribir / leer XML.


También puedes unirte a trax con esto:

public abstract class PipedSAXSource extends SAXSource { protected PipedSAXSource() { setXMLReader(new CallWriteDuringSax()); } protected abstract void writeTo(ContentHandler sink) throws IOException, SAXException; private class CallWriteDuringSax extends XMLFilterImpl { @Override public void parse(InputSource ignored) throws IOException, SAXException { writeTo(getContentHandler()); } @Override public void setFeature(String name, boolean value) {} } }

Utilizar como tal:

public static void main(String[] args) throws Exception { Source in = new PipedSAXSource() { @Override protected void writeTo(ContentHandler sink) throws SAXException { sink.startDocument(); sink.startElement("", "root", "root", new AttributesImpl()); sink.endElement("", "root", "root"); sink.endDocument(); } }; Transformer identity = TransformerFactory.newInstance().newTransformer(); identity.transform(in, new StreamResult(System.out)); }