使用XML模式作为OO继承(JAXB) - 可能吗?

时间:2010-11-12 16:06:36

标签: xml xsd jaxb restriction

我的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,我可以生成一个完全面向对象的继承结构。但它似乎没有编译; Eclipse显示错误:

derivation-ok-restriction.5.4.2:类型'IDResponse'的错误。该类型的颗粒不是对碱的颗粒的有效限制。 rcase-Recurse.2:粒子之间没有完整的功能映射。

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:0)

如果IDResponse正在扩展Response,“complexType”应为“complexContent”,“restriction”应为“extension”。