JAXB将许多对象编组到一个文件中

时间:2012-01-20 22:30:20

标签: java xml xml-serialization jaxb marshalling

我想将许多对象编组到一个xml文件中。这很顺利,只是我的marshaller坚持在每个对象之前添加额外的<?xml version="1.0" ?>

  1. 将多个对象编组到同一个文件中的首选方法是什么?
  2. 如果没有别的,摆脱这些无关的xml声明的最佳方法是什么?
  3. 我目前的代码:

    JAXBContext jc = JAXBContext.newInstance(relevantClasses);
    Marshaller m = jc.createMarshaller();
    
    XMLOutputFactory xof = XMLOutputFactory.newFactory();
    XMLStreamWriter xsw = xof.createXMLStreamWriter(Channels.newOutputStream(fileWriteChannel), "UTF-8");
    
    xsw.writeStartDocument("UTF-8", "1");
    
    m.marshal(object1, xsw);
    m.marshal(object2, xsw);
    
    xsw.close();
    

    这很好用,我得到了我期望的<object1><object2>数据......它在每个对象之前只有一个<?xml version="1.0" ?>

2 个答案:

答案 0 :(得分:6)

XML文档始终具有一个根元素,因此将多个对象编组到单个文件中将不会产生有效的XML。

您应该有一个具有Object1元素和Object2元素的根对象,并封送此根对象。

否则,Marshaller API doc说:

  

支持的属性

     

[...]

     

jaxb.fragment - value必须是java.lang.Boolean       此属性确定Marshaller是否将生成文档级事件。如果未指定属性,则   默认为false。此属性具有不同的含义   您正在使用哪个编组api - 当此属性设置为时   真:

     

[...]

     

marshal(Object,XMLStreamWriter) - Marshaller不会生成XMLStreamConstants.START_DOCUMENT和   XMLStreamConstants.END_DOCUMENT个事件。

答案 1 :(得分:0)

我认为你应该添加像

这样的根
@XmlRootElement(name = "Name")
public class EntityName   {

}