首页 > 解决方案 > 如何覆盖从父复杂类型继承的元素类型?

问题描述

我从 XSD 生成代码(使用 JAXB)。我有一个超类和几个子类。超类的属性之一(比如说,prop)有 type A。我也有类型B extends AC extends A(在 XSD 中定义)。超类的模式定义了一个类型为 的元素A,它被子类继承。我想使用类型BC不是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. 例如,我希望用in和in的prop类型覆盖。主要目标是在超类中拥有 ,但在子类中使用其他(兼容的)类型。List<B>Subclass1.javaList<C>Subclass2.javaprop

标签: javaxmlinheritancexsdjaxb

解决方案


I find no samples, where xsd elements(/complex types) are extended & overridden like that, but you can do it, when Subclass1 and Subclass2 (and Superclass) reside in different "definitions". You would xs:override Superclass in both of the "sub-xsds" (one with B and one with C type), and then extend them accordingly:

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>

and 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>

It must be in different definitions, because I don't know how to overcome the "name clash" (Superclass =? Superclass), but maybe someone has an idea? ...shows a better/n alternative way.

This solution is as easy/complex as "defining SuperclassB and SuperclassC". (questioning the necessity of Superclass!)


推荐阅读