2010-01-06 72 views
58

我经常需要为不同的基于XML的导入例程设计XML模式。很显然,XML模式会随着时间的推移而发展,或者它们可能包含修复的错误,所以捕获模式的版本以及使用一些机制来绑定特定版本非常重要。什么是版本控制XML模式的最佳实践?

目前我有两个方案:

  1. 该错误是架构和所有模式实例中发现必须遵守固定的版本。

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

最后我想出了存储架构的命名空间中的版本信息:

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" 

你知道更好的方法吗?

回答

79

这是一个非常棘手的问题,它甚至都不好笑,我花了数年的时间为其提供咨询支持。

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

这里有你一些提示,如果你入门:

  • 放一个小版本号,微版本号,日期,或其他任何东西的那种,到您的命名空间。每次更改名称空间时,都会中断所有处理应用程序。
  • 在XML实例文档中放入一个“版本”属性。这将使处理应用程序或版本适配器服务能够找出它正在处理的内容。
  • 确定是否构成向后兼容变更的策略,例如:添加可选元素不会中断发件人,也不会在接收者忽略他们不知道的元素(JAXB和XMLBeans可以这样配置)

不幸运!

+1

Sooo,或许我们应该在评论中提供关于版本的信息? – 2015-04-17 19:14:50

+0

有没有办法在使用JAXB进行反编组之后获取根目录中的版本号? – CMPE 2017-08-04 13:50:23