2012-08-06 14 views
9

Nie jestem pewien, czy poniższe pytanie jest możliwe z jaxb, ale mimo to zapytam.Czy Jaxb może marnować elementy potomne bez elementu głównego?

W pewnym projekcie używamy jaxb z określonym schematem, aby utworzyć następną strukturę pliku xml.

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

Jesteśmy również przy użyciu automatycznego klasy generowanie JAXB która tworzy klas: AAA i BBB gdzie aaa zostały wygenerowane jako @XmlRootElement.

Chcemy teraz użyć tego samego schematu w nowym projekcie, który będzie również zgodny z poprzednim projektem. Co chciałbym zrobić, to używać tych samych wygenerowanych klas jaxb, bez wykonywania żadnych zmian w schemacie, aby sondować tylko jeden obiekt bbb do xml.

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

Więc chcielibyśmy dostać następną wynik:

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

ja w tej chwili nie jestem w stanie zrobić tak jak naziemnego krzyczy, że nie mają @XmlRootElement zdefiniowane.

W rzeczywistości próbujemy uniknąć przypadku oddzielenia schematu na 2 schematy, jeden z niewielu bbb, a drugi, gdzie importuje bbb.

Z góry dziękuję!

+3

udało mi się znaleźć rozwiązanie w tym poście: [pofragmentowane przetaczanie z JAXB] [1] [1]: http://stackoverflow.com/questions/9295385/jaxb-fragmented-marshalling?lq=1 –

Odpowiedz

11

Jestem może późno z 3 lat, ale czy kiedykolwiek próbował coś takiego:

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

Oto artykuł używam kiedy muszę zebrać/unmarshal bez rootElement: http://www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html

To działa dla mnie całkiem dobrze. Piszę tę odpowiedź dla innych zagubionych dusz szukających odpowiedzi.

Wszystko co najlepsze:)

-1

Jestem późno może z 5 lat :) ale czy kiedykolwiek próbował coś takiego:

StringWriter stringWriter = new StringWriter(); 
JAXB.marshal(bbb, stringWriter); 
String bbbString = stringWriter.toString(); 
Powiązane problemy