【问题标题】:Using XML schemas as OO inheritance (JAXB) - possible?使用 XML 模式作为 OO 继承 (JAXB) - 可能吗?
【发布时间】:2011-05-09 04:03:28
【问题描述】:

我的 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>

我希望有一个“子类”,其中“转换”和“响应块”被替换为每种类型的有效“子类”。 IE。我已经通过限制/扩展派生了它们,并希望将它们包含在本身由限制派生的响应中:

<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:粒子之间没有完整的函数映射。

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

【问题讨论】:

    标签: xml xsd jaxb restriction


    【解决方案1】:

    【讨论】:

    • 非常感谢您的链接。不幸的是,他们似乎都没有解决这种特殊情况。第一个链接本质上是我现在已经在做的事情。第二个是全局元素而不是类型。第三个专注于从 Java 生成 XML,而不是相反。 8-(
    【解决方案2】:

    如果 IDResponse 是扩展 Response,“complexType”应该是“complexContent”,“restriction”应该是“extension”。

    【讨论】:

    • "complexType" 是一个错字,它确实是 complexContent。我的问题是,据我了解,“扩展”意味着您正在添加到现有字段,而“限制”意味着您正在更改它们。我想更改字段以使用“子类”而不是原始的更广泛的定义。我只是不确定这是否可能。
    • 不清楚您试图在 XSD 中描述什么样的类层次结构。也许层次结构图有助于传达您的问题。
    • 好吧,再看看这似乎是不可能的......我认为Java可以允许使用枚举进行继承,但事实并非如此。嗯......比我想要的有点混乱,但它按原样工作。 8-)
    猜你喜欢
    • 2011-10-07
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多