正在通过从完全相同的类型向后兼容扩展现有 XSD 类型来修改它



我为一个由客户实现的WS制作了早期的XSD+WSDL。我们实施客户端。我在 WS 创建操作中有这样的类型:

<xs:complexType name="tWorkCreate">
 <xs:sequence>
  <xs:element ref="plan:workkey"  />
  <xs:element ref="plan:workdata"  />
 </xs:sequence>
</xs:complexType>

现在我想对新的更新操作使用相同的类型,但命名是错误的。所以我打算这样做:

<xs:complexType name="tWorkSet">
 <xs:sequence>
  <xs:element ref="plan:workkey"  />
  <xs:element ref="plan:workdata"  />
 </xs:sequence>
</xs:complexType>

<xs:complexType name="tWorkCreate">
 <xs:complexContent>
  <xs:extension base="tWorkSet">
    <xs:sequence>
    </xs:sequence>
  </xs:extension>
 </xs:complexContent>
</xs:complexType>

并直接使用tWorkSet进行Update操作(tWorkCreate操作相同)。现有客户不需要(也没有实施)Update 。不复制类型的原因是,例如我们可以在代码中以类似的方式处理UpdateCreate。那么,是只复制类型更好,还是此扩展方案明智?

是的,以这种方式重构类型定义是一个好主意,并且向后兼容1。 在类型重构之前有效的所有相同 XML 文档在重构之后都将有效。 事实上,它比向后兼容更好,因为在更改之前有效的完全相同的 XML 文档集在更改后将有效。

1假设客户机对类型名称本身没有直接依赖关系,例如通过 JAXB 绑定或在 XML 文档实例中使用xsi:type。[感谢Petru Gardea。

向后兼容性在应用于XSD时非常棘手。架构可以以多种方式使用;如果没有对边界的深刻理解,这只是一种猜测。例如,通常声称更改类型名称向后兼容是错误的;如果有人在他们的有效XML中使用xsi:type怎么办?

还应仔细规划创建类型层次结构。与当今大多数主流OO语言一样,您只能从一种类型进行扩展。

在您的情况下,您似乎担心重用;那么也许最安全的可能是通过创建一个组来重用,然后根据需要由您的类型引用该组。当然,"最安全"取决于您定义的边界。对于 JAXB、.NET 等,支持组,默认情况下它们是内联的 - 即它们在 XML 和生成的代码方面没有任何占用空间。

<xs:group name="tWorkSet">
    <xs:sequence>
        <xs:element ref="plan:workkey"/>
        <xs:element ref="plan:workdata"/>
    </xs:sequence>
</xs:group>
<xs:complexType name="tWorkCreate">
    <xs:group ref="tWorkSet"/>
</xs:complexType>

最新更新