Java DomImplementationLS
-
03-07-2019 - |
Pergunta
Eu estou olhando para criar XML Document objetos em Java e serializar-los para uma matriz de bytes (antes de enviá-los através de uma conexão TCP). Atualmente tenho código que se parece com isso:
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();
}
A documentação Sun Java tem informações sobre um conjunto de interfaces que parece começar com DomImplementationLS para carga e XML poupança, o que eu poderia usar para preencher a peça que faltava acima com folga. Mas eu não consigo descobrir como criar um objeto que implementa DomImplementationLS.
Meu objetivo final é para serializar e desserializar objetos muito simples para XML codificado em matrizes de bytes, para que eu possa transmiti-los através de uma rede. Estou interessado em manter o peso leve solução, de modo que ele pode lidar com uma alta taxa de transferência de mensagens.
Estou interessado em soluções alternativas, desde que deixe-me especificar a estrutura XML exata que é enviado.
Eu, claro, tem que fornecer a desserialização quando essas mensagens XML são consumidos, mas há uma abundância de documentação e toturials disponível on-line para a leitura de XML, mas não muito para escrevê-lo.
Eu preferiria soluções que estão incluídos no Java 6, sem adição de pacotes.
Solução
Espero que isso ajude:
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());
}
}
Assim, por seu código, você precisa fazer algo como:
DOMImplementationLS ls = (DOMImplementationLS) parser.getDOMImplementation();
LSOutput lso = ls.createLSOutput();
lso.setByteStream(...);
LSSerializer lss = ls.createSerializer();
lss.write(..., lso);