处理JAXB集合

时间:2011-09-07 17:48:13

标签: java jaxb

我正在尝试使用JAXB解组以下XML:

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

我使用XJC生成了所有类。如果我想访问Composers集合,我必须这样做:

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

我有什么方法可以做以下事情吗?

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

我很欣赏需要一个Composers对象,因为它来自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>

2 个答案:

答案 0 :(得分:6)

@XmlElementWrapper 插件完全符合您的要求。

答案 1 :(得分:3)

对于任何不能或不想使用该插件的人: 如果您可以使用不同的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>

这将在Work类型上放置一个返回List<Composer>对象的方法。不幸的是,该方法被称为getComposer而不是getComposers,但您可以使用annotations or custom bindings来解决该问题。

相关问题