Использование XML-схем в качестве наследования ОО (JAXB) - возможно? - PullRequest
3 голосов
/ 12 ноября 2010

У меня есть набор сложных типов в моем файле схемы XML. В основном у меня есть куча «ответных» объектов. Каждый объект ответа следует тому же общему формату, но более конкретными способами. Так, например:

<xsd:simpleType name="Transition">
  <xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:complexType name="ResponseBlock"/>
<xsd:complexType name="Response">
  <xsd:complexContent>
    <xsd:sequence>
      <xsd:element name="transition" type="dto:Transition"/>
      <xsd:element name="data" type="dto:ResponseBlock"/>
    </xsd:sequence>
 </xsd:complexContent>
</xsd:complexType>

Я бы хотел иметь возможность иметь «подкласс» этого, где «transition» и «ResponseBlock» заменяются действительными «подклассами» каждого из этих типов. То есть Я уже получил их по ограничению / расширению и хочу включить их в ответ, который сам по себе получен путем ограничения:

<xsd:simpleType name="IDTransition">
  <xsd:restriction base="dto:Transition">
   <xsd:enumeration value="NEXT_PAGE"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="IDResponseBlock">
  <xsd:complexContent>
    <xsd:extension base="dto:ResponseBlock">
      <xsd:sequence>
        <xsd:element type="xsd:int" name="userID"/>
        <xsd:element type="xsd:string" name="userName"/>
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="IDResponse">
   <xsd:complexContent>
      <xsd:restriction base="Response">
         <xsd:sequence>
           <xsd:element name="transition" type="dto:IDTransition"/>
           <xsd:element name="data" type="dto:IDResponseBlock"/>
         </xsd:sequence>
      </xsd:restriction>
   </xsd:complexContent>
</xsd:complexType>

Таким образом, используя JAXB, я мог бы создать полностью объектно-ориентированную структуру наследования. Но это не похоже на компиляцию; Затмение показывает ошибку:

Derivection-OK-Restrict.5.4.2: Ошибка для типа 'IDResponse'. Частица типа не является допустимым ограничением частицы основания. rcase-Recurse.2: не существует полного функционального отображения между частицами.

Есть идеи, как мне этого добиться?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010
0 голосов
/ 15 ноября 2010

Если IDResponse расширяет ответ, «complexType» должен быть «complexContent», а «ограничение» должно быть «extension».

...