我正在尝试使用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>
答案 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来解决该问题。