如何使用JAXB编写多个XML根元素

时间:2015-07-09 00:37:07

标签: java xml jaxb

我有用于将Java对象编写为XML的代码

public void convToXML(SampleClass sample,File file){

          try {

            JAXBContext jaxbContext = JAXBContext.newInstance(SampleClass .class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();


            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            jaxbMarshaller.marshal(trans, file);
            jaxbMarshaller.marshal(trans, System.out);

              } catch (JAXBException e) {
            e.printStackTrace();
              }

        }

我还有一个在循环中生成对象的系统,但是这个方法只打印XML文件中的最新对象。我如何使它按顺序打印XML根元素而不是每次都写一个新的?

在向循环中的对象添加属性

后,我调用此方法
while(condition){
SampleClass sample = new SampleClass();
sample.setName("Sample");
sample.setId("432");
convToXML(sample)
}

我的System.out显示正确数量的XML对象,而文件只显示最新的。为什么是这样?马歇尔电话在一起。 。 。

1 个答案:

答案 0 :(得分:1)

确保在开始循环之前文件不存在;

对于marshaller,给FileOutputStream启用追加;

这是您的工作代码问题:

File file = ...;

public void convToXML(SampleClass sample, File file){
    try{
        JAXBContext jaxbContext = JAXBContext.newInstance(SampleClass.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        jaxbMarshaller.marshal(trans, new FileOutputStream(file, true));
        jaxbMarshaller.marshal(trans, System.out);

    }catch(JAXBException e){
        e.printStackTrace();
    }
}

file.delete();
while(condition){
    SampleClass sample = new SampleClass();
    sample.setName("Sample");
    sample.setId("432");
    convToXML(sample, file)
}