2009-03-06 4 views
1

Je cherche à créer des objets Document XML en Java et à les sérialiser en un tableau d'octets (avant de les envoyer via une connexion TCP). J'ai actuellement un code qui ressemble à ceci:Java DomImplementationLS

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

The Sun Java documentation a d'info sur un ensemble d'interfaces qui semble commencer par DomImplementationLS pour le chargement et XML enregistrement, que je pourrais utiliser pour remplir la pièce manquante ci-dessus haut la main. Mais je n'arrive pas à comprendre comment créer un objet qui implémente DomImplementationLS.

Mon but ultime est de sérialiser et de désérialiser des objets très simples en XML codés dans des tableaux d'octets, afin que je puisse les transmettre sur un réseau. Je suis intéressé à garder la solution légère, afin qu'elle puisse gérer un débit élevé de messages.

Je suis intéressé par les solutions alternatives, tant qu'elles me permettent de spécifier la structure XML exacte qui est envoyée. Je dois bien sûr fournir la désérialisation lorsque ces messages XML sont consommés, mais il y a beaucoup de documentation et de totaux disponibles en ligne pour lire du XML, mais pas beaucoup pour l'écrire.

Je préférerais des solutions qui sont incluses dans Java 6 sans ajouter de paquetages.

Répondre

3

Hope this helps:

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

} 

Alors, pour votre code, vous devez faire quelque chose comme:

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

Lol. Ça marche. Les os DBF sont connectés à l'os DB. Le DB-bone est connecté à l'os DOMI. Le DONI-bone est connecté à l'os LS .... – deemer