1

Java クラスから必要な XML を期待どおりに生成できません。

これはzooのプロパティを定義するクラスです

**//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 アノテーションも試してみましたが、うまくいきません。多くのチュートリアルを経験しましたが、解決策が見つかりませんでした。

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

}

FileWriterまたは、 のを作成することもできますFile。次に、開始要素を自分で作成できます。次に、JAXB を使用して各ZooインスタンスをにマーシャリングしますFileWriter(次のプロパティを利用して、JAXB で XML ヘッダーを除外する必要があります。

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

最後に、ルート要素を閉じる必要があります。

于 2013-03-29T12:33:59.280 に答える