2011-09-07 83 views
9

我試圖用JAXB來解讀以下XML:與JAXB集合處理

<Works> 
    <Work> 
     <Composers> 
      <Composer> 
       <Name>A name</Name> 
      </Composer> 
      <Composer> 
       <Name>A name 2</Name> 
      </Composer> 
     </Composers> 
    </Work> 
</Works> 

我已經生成的所有使用XJC的類。如果我想訪問作曲家系列,我必須這樣做:

List<Composer> composers = work.getComposers().getComposer(); 

有沒有什麼辦法可以做以下代替?

List<Composer> composers = work.getComposers(); 

我很欣賞的作曲家對象的需要,因爲它從XML導出,但在Java打交道時,具有存儲集合中間POJO似乎有點多餘。

我的XSD是:

<xsd:complexType name="Works"> 
    <xsd:sequence> 
     <xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Work"> 
    <xsd:sequence> 
     <xsd:element name="Composers" type="Composers"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composers"> 
    <xsd:sequence> 
     <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composer"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

+0

您有用於生成POJO的模式嗎? –

+0

列表 composers = work.getComposers()。getComposer();這看起來不正確。它應該只返回一個作曲家而不是作曲家名單。鑑於列表 composers = work.getComposers();這看起來正確。 –

+0

我已經添加了我的XSD模式 – seedhead

回答

6

@XmlElementWrapper插件不正是你想要的。

+1

謝謝威廉!不幸的是,這個插件不支持JAXB 2.1,只有2.0。這裏是降級到2.0的唯一選擇嗎? – seedhead

+0

我在使用JAXB 2.2.3的項目中沒有任何問題地使用它。你能告訴我你看到了什麼錯誤嗎? –

+0

沒有錯誤,但從XJC生成的類不包含預期的@XmlElementWrapper註釋。我正在使用Java 6和JAXB 2.1,您是否也在使用Java 6? – seedhead

2

對於任何不能或不想使用插件的人: 如果您可以使用不同的XML結構,可以通過簡單地使用maxoccurs="unbounded"並省略包含元素來避免生成額外的包裝類。使用原來的例子:

<xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"/> 

<xsd:complexType name="Work"> 
    <xsd:sequence> 
     <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composer"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

會產生這樣的結構:

<Work> 
    <Composer> 
     <Name>A name</Name> 
    </Composer> 
    <Composer> 
     <Name>A name 2</Name> 
    </Composer> 
</Work> 

這將使基於返回List<Composer>對象的工作類型的方法。不幸的是,該方法被稱爲getComposer而不是getComposers,但您可以使用annotations or custom bindings來解決該問題。