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

我经常必须为不同的基于XML的导入例程deviseXML模式。 很显然,XML模式会随着时间的推移而发展,或者可能包含修复的错误,所以捕获模式的版本以及使用一些机制来绑定特定的版本非常重要。

目前我有两种情况:

  1. 该错误在模式中find,所有模式实例必须符合固定版本。

  2. 模式升级,应该被认为是可取的,但也应该支持旧模式。

最后,我想出了在模式的命名空间中存储版本信息:

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

当修复一个错误时,我将它修复在同一个命名空间中,但是如果我要升级一个模式,那么我需要创build一个新的命名空间,但添加了升级月份:

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

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

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

你知道更好的方法吗?

这是一个非常棘手的问题,我甚至花了好几年的时间来提供咨询支持。

那里有很多最佳实践 ,但其中大部分并不适用于所有情况。 例如,许多人主张使用“xsd:any”来允许扩展,如果开发人员负责维护模式,将其转化为转储,那么这只是一种灾难。

如果您正在开始,以下是一些提示:

  • 不要将小版本号,微版本号,date或任何其他types放入命名空间中。 每次更改名称空间时,都会中断所有处理应用程序。
  • 在XML实例文档中放入“版本”属性。 这将使处理应用程序或版本适配器服务能够找出正在处理的内容。
  • 指定什么构成向后兼容的变更的策略,例如:添加可选元素不会破坏发件人,并且如果他们使用忽略他们不知道的元素的策略,则不会破坏接收者(JAXB和XMLBeans可以这样configuration)

祝你好运!

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