我从XSD(使用JAXB)生成代码。我有一个超类和几个子类。超类的属性之一(例如prop
)的类型为A
。我也有B extends A
和C extends A
类型(在XSD中定义)。超类的架构定义了A
类型的元素,该元素由子类继承。我想在子类中使用类型B
和C
而不是A
。
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="A" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Subclass1">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someAttribute" type="xsd:string"/>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Subclass2">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someOtherAttribute" type="xsd:int"/>
</xsd:complexContent>
</xsd:complexType>
生成的Superclass.java
将具有List<A> prop
。例如,我希望prop
中的类型List<B>
和Subclass1.java
中的List<C>
被Subclass2.java
覆盖。主要目标是在超类中拥有prop
,但在子类中使用其他(兼容)类型。
答案 0 :(得分:1)
我发现没有样本可以像这样扩展和覆盖xsd元素(/复杂类型),但是当Subclass1
和Subclass2
(以及Superclass
)驻留时,您可以执行此操作在不同的“定义”中。您可以同时在两个“ sub-xsds”中使用xs:override
Superclass
(一个带有B类型,另一个带有C类型),然后相应地扩展它们:
parent.xsd:
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="A" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
sub1.xsd:
<xs:override schemaLocation="parent.xsd">
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="B" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xs:override>
<!-- and just : -->
<xsd:complexType name="Subclass1">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someAttribute" type="xsd:string"/>
</xsd:complexContent>
</xsd:complexType>
和sub2.xsd:
<xs:override schemaLocation="parent.xsd">
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="C" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xs:override>
<xsd:complexType name="Subclass2">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someOtherAttribute" type="xsd:int"/>
</xsd:complexContent>
</xsd:complexType>
它必须具有不同的定义,因为我不知道如何克服“名称冲突”(Superclass =?Superclass),但是也许有人有想法吗? ...显示了一种更好的/ n种替代方法。
此解决方案与“定义SuperclassB和SuperclassC”一样容易/复杂。 (质疑超类的必要性!)