对 XML 模式进行版本控制的最佳实践是啥?
Posted
技术标签:
【中文标题】对 XML 模式进行版本控制的最佳实践是啥?【英文标题】:What are the best practices for versioning XML schemas?对 XML 模式进行版本控制的最佳实践是什么? 【发布时间】:2011-01-02 02:56:57 【问题描述】:我经常需要为不同的基于 XML 的导入例程设计 XML 模式。很明显,XML 模式会随着时间的推移而发展,或者它们可能包含需要修复的错误,因此捕获模式的版本并拥有一些机制来绑定特定版本非常重要。
目前我有两种情况:
在架构中发现错误,所有架构实例必须符合固定版本。
架构已升级,应被视为可取的,但也应支持旧架构。
最后我想出了在 schema 的命名空间中存储版本信息:
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"
你知道更好的方法吗?
【问题讨论】:
【参考方案1】:这是一个如此困难的主题,甚至都不好笑,而且我花了数年时间提供咨询支持。
那里有很多best practices,但其中大多数并非在所有情况下都有效。例如,许多人提倡使用“xsd:any”来允许扩展,如果开发人员负责维护架构,将其变成转储,这只会导致灾难。
如果您刚开始,这里有一些提示:
不要不要将次要版本号、微版本号、日期或任何其他类型的内容放入您的命名空间。每次更改命名空间时,都会中断所有处理应用程序。 不要在 XML 实例文档中添加“版本”属性。这将使处理应用程序或版本适配器服务能够确定它正在处理什么。 Do 指定构成向后兼容更改的策略,例如:添加可选元素不会破坏发送者,并且如果接收者使用忽略他们不知道的元素的策略(JAXB并且 XMLBeans 可以这样配置)祝你好运!
【讨论】:
Sooo,也许我们应该在评论中添加有关版本的信息? 有没有办法在使用 JAXB 解组后获取根目录中的版本号?【参考方案2】: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) 的广泛接受。以上是关于对 XML 模式进行版本控制的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章