我经常需要为不同的基于XML的导入例程设计XML模式。很明显,XML模式将随着时间的推移而发展,或者它们可能包含要修复的错误,因此捕获模式的版本并具有某种机制来绑定特定版本很重要。
目前我有两种场景:
>在模式中找到错误,所有模式实例必须符合固定版本。
>升级的模式,应被视为首选,但也应支持旧模式。
最后我想出了在模式的命名空间中存储版本信息:
targetNamespace="http://schemas.company.com/Geodesy/2010/River.xsd"
当修复bug时,我修复它在同一个命名空间,但如果我要升级一个模式,那么我需要创建一个新的命名空间,但升级月添加:
targetNamespace="http://schemas.company.com/Geodesy/2010/01/River.xsd"
如果我在一个月内有多个升级,那么只是追加一天:
targetNamespace="http://schemas.company.com/Geodesy/2010/01/17/River.xsd"
你知道更好的方法吗?
这是一个困难的主题,它甚至不是有趣的,我已花了多年提供咨询支持。
有很多best practices在那里,但大多数他们不工作在所有情况下。例如,许多人主张使用“xsd:any”来允许扩展,如果开发人员负责维护模式,将其转换为转储,则这只是一个灾难。
如果您开始使用,以下是一些提示:
>不要将小版本号,微版本号,日期或任何其他排序放入您的命名空间。每次更改命名空间时,您将中断所有处理应用程序。
>在XML实例文档中放置一个“version”属性。这将使处理应用程序或版本适配器服务能够确定它正在处理什么。
>请指定一个策略,什么构成向后兼容的更改,例如:添加可选元素不会打断发件人,并且不会打破接收者,如果他们使用忽略他们不知道的元素的策略(JAXB和XMLBeans可以配置这个办法)
祝你好运!