如何覆盖从父复杂类型继承的元素类型?

Mar*_*ova 6 java xml inheritance xsd jaxb

我从XSD(使用JAXB)进行代码生成.我有一个超类和几个子类.其中一个超类'属性(比如说prop),有类型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>
Run Code Online (Sandbox Code Playgroud)

生成的Superclass.java将有List<A> prop.例如,我想prop同类型被覆盖List<B>Subclass1.javaList<C>Subclass2.java.主要目标是prop在超类中使用,但在子类中使用其他(兼容)类型.

xer*_*593 1

我没有找到像这样扩展和覆盖 xsd 元素(/复杂类型)的示例,但是当Subclass1Subclass2(和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”一样简单/复杂。(质疑超类的必要性!)