2012-08-06 14 views
9

Ich bin mir nicht sicher, ob die folgende Frage mit Jaxb möglich ist, aber ich werde trotzdem fragen.Kann Jaxb Kindelemente ohne das Wurzelelement marshalieren?

In einem bestimmten Projekt verwenden wir Jaxb mit einem definierten Schema, um die nächste Struktur der XML-Datei zu erstellen.

<aaa> 
    <bbb> 
     more inner children here 
    </bbb> 
    <bbb> 
     more inner children here 
    </bbb> 
</aaa> 

Wir verwenden auch die automatische Generierung von Klasse jaxb die die Klassen erzeugt: aaa und bbb, wo aaa als @XmlRootElement generiert wurde.

Wir wollen nun das gleiche Schema in einem neuen Projekt verwenden, das auch mit dem vorherigen Projekt kompatibel ist. Was ich tun möchte, ist die Verwendung der gleichen Jaxb-generierten Klassen, ohne irgendwelche Änderungen im Schema durchzuführen, um nur ein einziges bbb-Objekt in xml zu marshallen.

JAXBContext jc = JAXBContext.newInstance("generated"); 
Marshaller marshaller = jc.createMarshaller(); 
marshaller.marshal(bbb, writer); 

So würden wir das nächste Ergebnis:

<bbb> 
    <inner child1/> 
    <inner child2/> 
    ... 
</bbb> 

Ich bin derzeit nicht in der Lage, dies zu tun, wie der Einweiser brüllt, dass ich nicht ein @XmlRootElement definiert.

Wir versuchen tatsächlich, den Fall der Trennung des Schemas in 2 Schemas zu vermeiden, eines von nur bbb und das andere, wo aaa bbb importiert.

Vielen Dank im Voraus!

+3

Ich konnte die Lösung in diesem Beitrag nicht finden: [Fragmentierte Rangier- mit jaxb] [1] [1]: http://stackoverflow.com/questions/9295385/jaxb-fragmented-marshalling?lq=1 –

Antwort

11

Ich bin vielleicht mit 3 Jahren spät, aber haben Sie schon einmal versucht, etwas wie folgt aus:

public static String marshal(Bbb bbb) throws JAXBException { 
    StringWriter stringWriter = new StringWriter(); 

    JAXBContext jaxbContext = JAXBContext.newInstance(Bbb.class); 
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

    // format the XML output 
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

    QName qName = new QName("com.yourModel.bbb", "bbb"); 
    JAXBElement<Bbb> root = new JAXBElement<Bbb>(qName, Bbb.class, bbb); 

    jaxbMarshaller.marshal(root, stringWriter); 

    String result = stringWriter.toString(); 
    LOGGER.info(result); 
    return result; 
} 

Hier ist der Artikel, den ich benutze, wenn ich/Abstellungs ohne rootElement Marschall haben: http://www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html

Es funktioniert ganz gut für mich. Ich schreibe diese Antwort für andere verlorene Seelen, die nach Antworten suchen.

Alles Gute:)

-1

Ich bin vielleicht mit 5 Jahren spät :) aber haben Sie jemals versucht, etwas wie folgt aus:

StringWriter stringWriter = new StringWriter(); 
JAXB.marshal(bbb, stringWriter); 
String bbbString = stringWriter.toString(); 
Verwandte Themen