Как переопределить тип элемента, унаследованного от родительского сложного типа? - PullRequest
0 голосов
/ 23 декабря 2018

Я делаю генерацию кода из 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 в суперклассе, но использовать другие (совместимые) типы в подклассах.

1 Ответ

0 голосов
/ 15 января 2019

Я не нашел примеров, где элементы xsd (/ сложные типы) расширяются и переопределяются таким образом, но вы можете сделать это, когда Subclass1 и Subclass2Superclass) находятся в разных «определениях».Вы должны xs:override Superclass в обоих «sub-xsds» (один с 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>

Это должно быть в разных определениях, потому что я не знаю, как преодолеть "конфликт имен""(Суперкласс =? Суперкласс), но, может быть, у кого-то есть идея?... показывает лучший / N альтернативный способ.

Это решение так же просто / сложно, как «определение SuperclassB и SuperclassC».(ставя под сомнение необходимость суперкласса!)

...