Pregunta

Estoy buscando crear objetos de documento XML en Java y serializarlos en una matriz de bytes (antes de enviarlos a través de una conexión TCP). Actualmente tengo un código que se ve así:

public byte [] EncapsulateThingy( ThingyType thingy )
{
    parser.reset(); // parser is a pre-existing DocumentBuilder object
    Document doc = parser.newDocument();
    doc.appendChild( doc.createElement("Thingy") );
    // ...  add nodes to doc to represent thingy
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream( 8192 ); 

    //
    // Missing: Write doc to outputStream with xml version 1.0 and UTF-8 
    // encoding.
    //

    return outputStream.toByteArray();
}

La documentación de Sun Java tiene información sobre un conjunto de interfaces que parece comenzar con DomImplementationLS para cargar y guardar XML, que podría usar para completar la pieza faltante arriba fácilmente. Pero no puedo averiguar cómo crear un objeto que implemente DomImplementationLS.

Mi objetivo final es serializar y deserializar objetos muy simples a XML codificados en matrices de bytes, para poder transmitirlos a través de una red. Estoy interesado en mantener la solución liviana para que pueda manejar un alto rendimiento de mensajes.

Me interesan las soluciones alternativas, siempre que me permitan especificar la estructura XML exacta que se envía.

Por supuesto, tengo que proporcionar la deserialización cuando se consumen estos mensajes XML, pero hay mucha documentación y publicaciones disponibles en línea para leer XML, pero no mucho para escribirlo.

Preferiría las soluciones que se incluyen en Java 6 sin agregar paquetes.

¿Fue útil?

Solución

Espero que esto ayude:

import java.io.ByteArrayOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.junit.Test;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;

public class DomLsTest {

    @Test
    public void testDomLs() throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        DOMImplementation di = db.getDOMImplementation();
        Document d = di.createDocument("", "foo", null);
        Element e = d.createElement("bar");
        d.getDocumentElement().appendChild(e);
        DOMImplementationLS ls = (DOMImplementationLS) di;
        LSOutput lso = ls.createLSOutput();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        lso.setByteStream(baos);
        LSSerializer lss = ls.createLSSerializer();
        lss.write(d, lso);
        System.out.println(baos.toString());
    }

}

Entonces, para tu código, deberías hacer algo como:

DOMImplementationLS ls = (DOMImplementationLS) parser.getDOMImplementation();
LSOutput lso = ls.createLSOutput();
lso.setByteStream(...);
LSSerializer lss = ls.createSerializer();
lss.write(..., lso);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top