是否通过从完全相同的类型向后兼容扩展来修改现有 XSD 类型?
Is modifying existing XSD type by extending it from exact same type backward compatible?
我之前为客户实现的一个WS制作了XSD+WSDL。我们实施客户端。我在 WS Create-operation 中有这样的类型:
<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
。不复制类型的原因是,例如我们可以在代码中类似地处理 Update
和 Create
。那么是只复制类型更好还是这种扩展方案明智?
是的,以这种方式重构类型定义是个好主意,并且向后兼容1。在类型重构之前有效的所有相同 XML 文档将在重构之后有效。事实上,它比向后兼容更好,因为 完全 相同的一组 XML 在更改之前有效的文档将在更改之后有效。
1假设客户端对类型名称本身没有直接依赖性,例如通过 JAXB 绑定或 xsi:type
在 [=24= 中使用] 文档实例。 [感谢 Petru Gardea.]
应用于 XSD 时,向后兼容性非常棘手。模式可以以多种方式使用;没有对边界的深入了解,这只是一个猜测。例如,通常声称更改类型名称是向后兼容的说法是错误的;如果有人在其有效 XML 中使用 xsi:type 怎么办?
创建类型层次结构也应该仔细计划。与当今大多数主流 OO 语言一样,您只能从一种类型进行扩展。
在你的情况下,你似乎很关心重用;那么最安全的方法可能是通过创建一个组来重用,然后根据需要由您的类型引用。当然,"safest"取决于你定义的边界。对于 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>
我之前为客户实现的一个WS制作了XSD+WSDL。我们实施客户端。我在 WS Create-operation 中有这样的类型:
<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
。不复制类型的原因是,例如我们可以在代码中类似地处理 Update
和 Create
。那么是只复制类型更好还是这种扩展方案明智?
是的,以这种方式重构类型定义是个好主意,并且向后兼容1。在类型重构之前有效的所有相同 XML 文档将在重构之后有效。事实上,它比向后兼容更好,因为 完全 相同的一组 XML 在更改之前有效的文档将在更改之后有效。
1假设客户端对类型名称本身没有直接依赖性,例如通过 JAXB 绑定或 xsi:type
在 [=24= 中使用] 文档实例。 [感谢 Petru Gardea.]
应用于 XSD 时,向后兼容性非常棘手。模式可以以多种方式使用;没有对边界的深入了解,这只是一个猜测。例如,通常声称更改类型名称是向后兼容的说法是错误的;如果有人在其有效 XML 中使用 xsi:type 怎么办?
创建类型层次结构也应该仔细计划。与当今大多数主流 OO 语言一样,您只能从一种类型进行扩展。
在你的情况下,你似乎很关心重用;那么最安全的方法可能是通过创建一个组来重用,然后根据需要由您的类型引用。当然,"safest"取决于你定义的边界。对于 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>