Mar*_*ova 6 java xml inheritance xsd jaxb
我从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>
Run Code Online (Sandbox Code Playgroud)
生成的Superclass.java将有List<A> prop.例如,我想prop同类型被覆盖List<B>在Subclass1.java与List<C>中Subclass2.java.主要目标是prop在超类中使用,但在子类中使用其他(兼容)类型.
我没有找到像这样扩展和覆盖 xsd 元素(/复杂类型)的示例,但是当Subclass1和Subclass2(和Superclass)驻留在不同的“定义”中时,您可以这样做。您将xs:override Superclass在两个“sub-xsd”(一个具有 B 类型,一个具有 C 类型)中,然后相应地扩展它们:
父.xsd:
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="A" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)
子1.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>
Run Code Online (Sandbox Code Playgroud)
和 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>
Run Code Online (Sandbox Code Playgroud)
它必须有不同的定义,因为我不知道如何克服“名称冲突”(超类=?超类),但也许有人有一个想法?...展示了一种更好的替代方法。
这个解决方案就像“定义 SuperclassB 和 SuperclassC”一样简单/复杂。(质疑超类的必要性!)