如何使用JAXB输出对象集合?

时间:2013-03-29 11:22:23

标签: java jaxb

无法按预期从java类生成所需的XML。

这是一个定义zoo

属性的类
**//Modal Class**
 public class Zoo 
{
private String name;
private String place;
    //Getters Setters

}

动态类,包含要在XML中的zoo类列表

//具有多个zoo类对象的Action类

@ManagedBean
@XmlRootElement
public @SessionScoped class zoos implements Serializable {
   private String name;
   private String place;
   private static final ArrayList<Zoo> zoo_list
= new ArrayList<Zoo>();

    @XmlElement
public ArrayList<Zoo> getZoo_list()
{
  return zoo_list;

}
    public void xmleg()
    {

        File file = new File("C:\\file.xml");   
        for(Zoo add: zoo_list)
        {
         try 
         {
            JAXBContext jaxbContext = JAXBContext.newInstance(Zoos.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();


            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);


            jaxbMarshaller.marshal(new JAXBElement<Zoo>(new QName("","Zoo"),zoo.class,add),file);
            jaxbMarshaller.marshal(new JAXBElement<Zoo>(new QName("","Zoo"),zoo.class,add),System.out);

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

生成的输出是:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
    <linkId>0</linkId>
    <name>gfdsgdgtretr</name>
    <place>gdfg</place>
</zoo>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
   <linkId>0</linkId>
    <name>gfdsgdgtretr</name>
    <place>gdfg</place>
</zoo>

但预期输出应为:

 <zoos>
   <zoo>
     <linkId>0</linkId>
     <name>gfdsgdgtretr</name>
     <place>gdfg</place>
  </zoo>
  <zoo>
    <linkId>0</linkId>
    <name>gfdsgdgtretr</name>
    <place>gdfg</place>
  </zoo>     
  </zoos>

也试过了@XMLElementWrapper注释,但它也没有用。虽然经历了很多教程,但没有找到解决方案。

1 个答案:

答案 0 :(得分:1)

<强>更新

我刚刚重读了您的问题,您已经拥有Zoos课程。您应该编组该实例而不是zoo_list属性中的单个项目。您可以使用@XmlElement注释更改属性映射到的元素名称。

@XmlElement(name="zoo")
public ArrayList<Zoo> getZoo_list()

JAXB(JSR-222)实现需要根对象。最简单的方法是创建一个名为Zoos的对象,该对象保存在Zoo对象列表中并编组该对象。

@XmlRootElement
public class Zoos {

    private List<Zoo> zoo;

    public List<Zoo> getZoo() {
        return zoo;
    }

    public void setZoo(List<Zoo> zoo) {
        this.zoo = zoo;
    }

}

或者,您可以为FileWriter创建File。然后你可以自己编写start元素。然后使用JAXB将每个Zoo实例封送到FileWriter(您需要利用以下属性让JAXB排除XML标头。

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

最后,您需要关闭根元素。