2012-08-06 12 views
9

Non sono sicuro che la seguente domanda sia possibile con jaxb, ma lo chiederò comunque.Jaxb può eseguire il marshalling di elementi figlio senza l'elemento radice?

In un determinato progetto, stiamo utilizzando jaxb con uno schema definito per creare la struttura successiva del file xml.

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

Stiamo anche utilizzando la generazione automatica classe di JAXB che crea le classi: AAA e BBB, dove aaa è stato generato come il @XmlRootElement.

Ora vogliamo utilizzare lo stesso schema in un nuovo progetto, che sarà anche compatibile con il progetto precedente. Quello che mi piacerebbe fare è usare le stesse classi generate da jaxb, senza eseguire alcuna modifica nello schema al fine di effettuare il marshalling di un singolo oggetto bbb in xml.

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

Così si otterrebbe il risultato successivo:

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

non sono attualmente in grado di farlo come l'marshaller urla che io non ho un @XmlRootElement definito.

Stiamo in realtà cercando di evitare il caso di separare lo schema in 2 schemi, uno solo di bbb e l'altro in cui aaa importa bbb.

Grazie in anticipo!

+3

sono stato in grado di trovare la soluzione in questo post: [smistamento frammentato JAXB] [1] [1]: http://stackoverflow.com/questions/9295385/jaxb-fragmented-marshalling?lq=1 –

risposta

11

Sono forse in ritardo con 3 anni, ma avete mai provato una cosa del genere:

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

Ecco l'articolo che uso quando devo maresciallo/unmarshalling senza rootElement: http://www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html

E ' funziona abbastanza bene per me. Sto scrivendo questa risposta per altre anime perse alla ricerca di risposte.

Tutto il meglio:)

-1

Sono forse in ritardo di 5 anni :) ma avete mai provato una cosa del genere:

StringWriter stringWriter = new StringWriter(); 
JAXB.marshal(bbb, stringWriter); 
String bbbString = stringWriter.toString(); 
Problemi correlati