2

在昨天这个类似的问题之后,我还有另一个关于 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>意味着可能有一个Book或一个Journal我更喜欢

private Publication bookOrJournal;

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

private List<Publication> bookOrJournal;

如何使用非收藏属性来实现这一点?

4

1 回答 1

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>

执行后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">
于 2012-04-13T13:19:35.623 回答