<xs:choice>元素的XJC Java类生成,它不是无界限的</xs:choice>

时间:2012-04-13 08:57:54

标签: inheritance xsd jaxb xjc

在昨天这个类似的question之后,我还有另一个关于XML模式和XJC绑定中继承的问题。

给定以下选项元素,使Book和Journal具有共同的父类型(Publication)。

<xsd:choice >
    <xsd:element name="Book" type="Book" />
    <xsd:element name="Journal" type="Journal" />
</xsd:choice>

生成的Java类属性如下:

private Book book;
private Journal journal;

由于<xsd:choice>表示可能有BookJournal我更喜欢

private Publication bookOrJournal;

如果我通过在选择元素中设置maxOccurs="unbounded"来获得出版物列表,那么它会以这种方式工作,我会得到

private List<Publication> bookOrJournal;

如何使用非集合属性实现此目的?

1 个答案:

答案 0 :(得分:5)

您可以使用以下XJC binding来实现此目的。

<xs:complexType name="myClass">
  <xs:sequence>
    <xs:choice>
      <xs:annotation>
        <xs:appinfo>
          <jaxb:property name="bookOrJournal"/>
        </xs:appinfo>
      </xs:annotation>
      <xs:element name="Book" type="Book"/>
      <xs:element name="Journal" type="Journal"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

执行xjc <XSD File> -extension后,这为我生成了以下Java类。

@XmlElements({
    @XmlElement(name = "Book", type = Book.class),
    @XmlElement(name = "Journal", type = Journal.class)
})
protected Publication bookOrJournal;

要使用XJC绑定,我将以下内容添加到了XSD的顶部。

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc">