2012-08-06 210 views
9

我不确定下列问题是否可以用jaxb,但我会问。Jaxb可以元素没有根元素的元素吗?

在某个项目中,我们使用具有已定义模式的jaxb来创建xml文件的下一个结构。

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

我们还利用JAXB的自动类发生它创建的类:AAA和bbb,,其中aaa被作为@XmlRootElement生成。

我们现在想在新项目中使用相同的模式,这也将与以前的项目兼容。 我想要做的是使用相同的jaxb生成的类,而不对模式进行任何更改,以便仅将单个bbb对象编组为xml。作为编组破口大骂,我没有@XmlRootElement定义做

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

我目前不能够这样做:

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

所以我们会得到下一个结果。

我们实际上试图避免将模式分解为2个模式的情况,其中只有一个是bbb,另一个是aaa导入bbb。

在此先感谢!

+3

我能找到这个职位的解决方案: [使用JAXB零散编组] [1] [1]:http://stackoverflow.com/questions/9295385/jaxb-fragmented-marshalling?lq=1 – 2012-08-06 07:43:53

回答

11

我也许晚了3年,但你有没有尝试过这样的事情:

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

这里是当我有没有rootElement的元帅/解组我使用的文章: http://www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html

它对我来说工作得很好。我正在为其他失去灵魂寻找答案的人写回应。

所有最好的:)

-1

我也许后期用5年时间:)但是你有没有尝试过这样的事情:

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