版本化XML模式的最佳实践是什么?

时间:2010-01-06 16:03:47

标签: xml xsd versioning

我经常需要为不同的基于XML的导入例程设计XML模式。很明显,XML模式会随着时间的推移而发展,或者它们可能包含要修复的错误,因此捕获模式的版本并使用某种机制来绑定特定版本非常重要。

目前我有两种情况:

  1. 在架构中发现错误,所有架构实例都必须符合固定版本。

  2. 架构已升级,应该被视为首选,但也应支持旧架构。

  3. 最后,我想出了在架构名称空间中存储版本信息:

    targetNamespace="http://schemas.company.com/Geodesy/2010/River.xsd"
    

    修复错误时我将其修复到同一个命名空间中,但是如果我要升级架构,那么我需要创建一个新的命名空间但是添加了升级月份:

    targetNamespace="http://schemas.company.com/Geodesy/2010/01/River.xsd"
    

    如果我在一个月内有多次升级,那么也只需追加一天:

    targetNamespace="http://schemas.company.com/Geodesy/2010/01/17/River.xsd"
    

    你知道更好的方法吗?

2 个答案:

答案 0 :(得分:85)

这是一个如此困难的主题,它甚至都不好笑,而且我花了数年时间为其提供咨询支持。

那里有很多best practices,但其中大多数并不适用于所有情况。例如,许多人提倡使用“xsd:any”来允许扩展,如果开发人员负责维护模式,将其转换为转储,那么这只是一种灾难。

如果您开始使用,以下是一些提示:

  • 将次要版本号,微型版本号,日期或其他任何类型的内容放入您的命名空间。每次更改命名空间时,都将中断所有处理应用程序。
  • 执行在XML实例文档中放置“version”属性。这将使处理应用程序或版本适配器服务能够确定它正在处理什么。
  • 执行指定构成向后兼容更改的策略,例如:添加可选元素不会破坏发件人,如果他们使用忽略元素的策​​略,也不会破坏接收者知道(可以用这种方式配置JAXB和XMLBeans)
祝你好运!

答案 1 :(得分:6)

http://www.xml.com/pub/a/2004/07/21/design.html提供了很好的指导,XML Schema 1.1通过条件包含(http://www.w3.org/TR/xmlschema11-1/#cip)启用了“版本控制”。