对XML模式进行版本控制的最佳实践是什么?


69

我经常不得不为不同的基于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"

您知道更好的方法吗?

Answers:


88

这是一个非常困难的主题,甚至都不是一件有趣的事情,而且我花了多年的时间为其提供咨询支持。

有很多最佳做法,但是其中大多数并非在所有情况下都有效。例如,许多人主张使用“ xsd:any”来允许扩展,如果开发人员负责维护模式并将其变成转储,那仅仅是灾难的根源。

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

  • 千万不能把一个小版本号,微版本号,日期,或任何东西的那种东西,到您的命名空间。每次更改名称空间时,都会中断所有处理应用程序。
  • 不要在XML实例文档中放置“版本”属性。这样一来,处理应用程序或版本适配器服务便可以确定正在处理的内容。
  • 指定一种构成向后兼容更改的策略,例如:添加可选元素不会破坏发送者,并且不会破坏接收者,如果他们使用忽略不知道的元素的策略(JAXB和XMLBeans可以通过这种方式配置) )

厄运!


1
如此,也许我们应该只在注释中添加有关版本的信息?
卢卡斯Zaroda

用JAXB解组后,是否有办法在根目录中获得版本号?
CMPE

6

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


相关提示:尽管XSD 1.1确实确实很老,但是大多数平台上仍然缺乏对此的支持。看来,对此的技术共识是要脱离对XSD 1.1的支持。有一些库,例如用于Java的Xerces-J(虽然不是Xerces C / C ++!)和用于Java,.net,C / C ++和PHP的商业Saxon-EE,但这要付出一定的代价(这从商业POV来说是有意义的,但阻碍了1.1的广泛接受。
塞缪尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.