簡體   English   中英

如何使用JAXB輸出對象集合?

[英]How do I output a collection of objects with JAXB?

無法按預期從java類生成所需的XML。

這是一個定義動物園屬性的類

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

}

動作類,其中動物園類的列表使用XML

//具有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批注,但它也無法正常工作。經歷了許多教程,但沒有找到解決方案。

UPDATE

我只是重新閱讀了您的問題,您已經有Zoos課。 您應該將其實例而不是zoo_list屬性中的單個項目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;
    }

}

或者,您可以為File創建一個FileWriter 然后,您可以自己編寫start元素。 然后使用JAXB將每個Zoo實例編組到FileWriter (您將需要利用以下屬性來使JAXB排除XML標頭。

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

最后,您需要關閉根元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM