2011-09-07 60 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来解决该问题。