在昨天这个类似的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>
表示可能有Book
或Journal
我更喜欢
private Publication bookOrJournal;
如果我通过在选择元素中设置maxOccurs="unbounded"
来获得出版物列表,那么它会以这种方式工作,我会得到
private List<Publication> bookOrJournal;
如何使用非集合属性实现此目的?
答案 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">