用于<xs:choice>元素的XJC Java类生成,它不是无限制的

rai*_*198 2 inheritance xsd jaxb xjc

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

给出以下选择元素,使Book和Journal具有共同的父类型(Publication).

<xsd:choice >
    <xsd:element name="Book" type="Book" />
    <xsd:element name="Journal" type="Journal" />
</xsd:choice>
Run Code Online (Sandbox Code Playgroud)

生成的Java类属性如下:

private Book book;
private Journal journal;
Run Code Online (Sandbox Code Playgroud)

因为<xsd:choice>意味着可能有一个Book或一个Journal我更喜欢

private Publication bookOrJournal;
Run Code Online (Sandbox Code Playgroud)

如果我通过maxOccurs="unbounded"在choice元素中设置了一个Publications列表,它会以这种方式工作,我会得到

private List<Publication> bookOrJournal;
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*sen 5

您可以使用以下XJC绑定来实现此目的.

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

为了使用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">
Run Code Online (Sandbox Code Playgroud)