14

I'm not sure if the following question is possible with jaxb, but I'll ask anyway.

In a certain project, we're using jaxb with a defined schema to create the next structure of xml file.

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

We're also using the automatic class generating of jaxb which creates the classes: aaa and bbb, where aaa was generated as the @XmlRootElement.

We now want to use the same schema in a new project, that will be also compatible with the previous project. What I would like to do, is to use the same jaxb generated classes, without performing any changes in the schema in order to marshal only a single bbb object into xml.

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

So we would get the next result:

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

I'm currently not able to do so as the marshaller yells that I do not have a @XmlRootElement defined.

We're actually trying to avoid the case of separating the schema into 2 schemas, one of only bbb and the other where aaa imports bbb.

Thanks in advance!

Meny Issakov
  • 1,400
  • 1
  • 14
  • 30
  • 3
    I was able to find the solution in this post: [Fragmented marshalling with Jaxb][1] [1]: http://stackoverflow.com/questions/9295385/jaxb-fragmented-marshalling?lq=1 – Meny Issakov Aug 06 '12 at 07:43

2 Answers2

31

I am maybe late with 3 years but have you ever tried something like that :

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

Here is the article I use when I have to marshal/unmarshal without rootElement : http://www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html

It works pretty fine for me. I am writing this response for other lost souls searching for answers .

All the best : )

Lazar Lazarov
  • 2,412
  • 4
  • 26
  • 35
3

I am maybe late with 5 years :) but have you ever tried something like that :

StringWriter stringWriter = new StringWriter();
JAXB.marshal(bbb, stringWriter);
String bbbString = stringWriter.toString();
cheb1k4
  • 2,316
  • 7
  • 26
  • 39