سؤال

أبحث عن إنشاء مستند XML الكائنات في جافا و تسلسل لهم إلى صفيف بايت (قبل إرسالها عبر اتصال 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();
}

الشمس جافا الوثائق يحتوي الفندق على مجموعة من الواجهات التي يبدو أن يبدأ مع DomImplementationLS التحميل وتوفير XML التي يمكنني استخدامها لملء في عداد المفقودين قطعة أعلاه بسهولة.ولكن أنا لا يمكن معرفة كيفية إنشاء كائن التي تنفذ DomImplementationLS.

هدفي النهائي هو تسلسل إلغاء تسلسل بسيط جدا كائنات XML المشفرة في صفائف بايت, لذا يمكن أن تنقل لهم عبر الشبكة.أنا مهتم في الحفاظ على حل خفيفة الوزن بحيث يمكن التعامل مع إنتاجية عالية من الرسائل.

أنا مهتم في الحلول البديلة ، طالما أنها اسمحوا لي أن يحدد بالضبط هيكل XML التي يتم إرسالها.

أنا بالطبع يجب أن نقدم إلغاء التسلسل عند هذه XML الرسائل المستهلكة ، ولكن هناك الكثير من الوثائق toturials المتاحة على الإنترنت عن القراءة XML, ولكن ليس كثيرا على الكتابة.

أنا أفضل الحلول التي تم تضمينها في جافا 6 دون إضافة حزم.

هل كانت مفيدة؟

المحلول

نأمل أن يكون هذا مساعدة:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top