2011-02-02 3 views
14

JAXBアノテーションで少し助けが必要ですが、私はこれを把握するのに役立つ優れたドキュメントを見つけることができませんでした。JAXB Annotations

XMLにマーシャリングするクラスがあります。私のクラスには、次のようになります。

@XmlRootElement(name="car") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
    "vid", 
    "make", 
    "model", 
    "recalls", 
    "engSpec" 
}) 

public class Car { 
    @XmlElement(name="vid", required=true) 
    private String vid; 
    @XmlElement(name="make", required=true) 
    private String make; 
    @XmlElement(name="model", required=true) 
    private String model; 
    @XmlElement(name="recalls", required=true) 
    private ArrayList<Recall> recalls; 
    @XmlElement(name="engSpec", required=true) 
    private EngSpec engSpec; 
... 

リコールクラスは次のようになります。

@XmlRootElement(name = "recall") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
     "type", 
     "date" 
}) 
public class Recall { 
    @XmlElement(name="type", required=true) 
    private String type; 
    @XmlElement(name="date", required=true) 
    private String date; 
... 

だから、このXML出力を生成します。

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
</recalls> 
<recalls> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

しかし、私は、ArrayListを表示します異なって、このように:

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <recall> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
    </recall> 
    <recall> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
    </recall> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

どのように私はこれを行うことができますか? 私はこの問題は私のスキーマであると思いますが、私はマーシャリングのためにこれを使用します。

JAXBContext jc = JAXBContext.newInstance(Car.class); 
Marshaller marsh = jc.createMarshaller(); 
marsh.marshal(car, out); 

任意のアイデアはどのようにこの問題を解決するために?ありがとう! documentationから

@XmlRootElement(name="car") 
... 
public class Car { 
    ... 

    @XmlElementWrapper(name="recalls") // this name=... can be omitted, as it 
             // is the same as the field name 
    @XmlElement(name="recall") 
    private ArrayList<Recall> recalls; 
} 

+5

ちなみに、あなたのbeanプロパティ名がXML要素と同じであれば、@ XmlElement'アノテーションを指定する必要はありません。 :) – limc

答えて

31

はこれを試してみてください

XmlElementWrapper:XML表現に関わるラッパー要素を生成します。これは主に、コレクションの周りにラッパーXML要素を生成するために使用されることを意図しています。

+1

素晴らしい、これは素晴らしい仕事!ありがとうございました! –