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

时间:2018-12-23 17:53:47

标签: 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>

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

1 个答案:

答案 0 :(得分:1)

我发现没有样本可以像这样扩展和覆盖xsd元素(/复杂类型),但是当Subclass1Subclass2(以及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”一样容易/复杂。 (质疑超类的必要性!)