Java DomImplementationLS - PullRequest
       5

Java DomImplementationLS

1 голос
/ 06 марта 2009

Я ищу создание объектов XML-документов на Java и сериализацию их в байтовый массив (до отправки их по TCP-соединению). В настоящее время у меня есть код, который выглядит следующим образом:

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();
}

Документация Sun Java содержит информацию о наборе интерфейсов, который, кажется, начинается с DomImplementationLS для загрузки и сохранения XML, который я мог бы использовать для удобного заполнения отсутствующего фрагмента выше. Но я не могу понять, как создать объект, который реализует DomImplementationLS.

Моя конечная цель - сериализовать и десериализовать очень простые объекты в XML, закодированные в байтовые массивы, чтобы я мог передавать их по сети. Я заинтересован в том, чтобы облегчить решение, чтобы оно могло обрабатывать сообщения с высокой пропускной способностью.

Я заинтересован в альтернативных решениях, если они позволяют мне точно указать структуру XML, которая будет отправлена.

Я, конечно, должен обеспечить десериализацию при использовании этих сообщений XML, но в Интернете доступно множество документации и итоговых данных для чтения XML, но не так много для их написания.

Я бы предпочел решения, включенные в Java 6, без добавления пакетов.

1 Ответ

3 голосов
/ 06 марта 2009

Надеюсь, это поможет:

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());
    }

}

Итак, для вашего кода вам нужно сделать что-то вроде:

DOMImplementationLS ls = (DOMImplementationLS) parser.getDOMImplementation();
LSOutput lso = ls.createLSOutput();
lso.setByteStream(...);
LSSerializer lss = ls.createSerializer();
lss.write(..., lso);
...