1

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

这是一个定义 zoo 属性的类

**//Modal Class**
 public class Zoo 
{
private String name;
private String place;
    //Getters Setters

}

带有动物园类列表的动作类在 XML 中

//具有动物园类多个对象的动作类

@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 注释,但它也不起作用。已经阅读了许多教程,但没有找到解决方案。

4

1 回答 1

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

}

或者,您可以FileWriterFile. 然后你可以自己写开始元素。Zoo然后使用 JAXB 将每个实例编组到FileWriter(您将需要利用以下属性让 JAXB 排除 XML 标头。

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

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

于 2013-03-29T12:33:59.280 回答