对 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 模式进行版本控制的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda - 在 CI/CD 管道中版本控制和提升 lambda 的最佳实践是啥

使用 TeamCity 合并语义版本控制的最佳实践是啥

使用 WCF 对服务进行版本控制的最佳实践?

最佳实践:软件版本控制 [关闭]

微服务版本最佳实践

进行微服务 REST API 版本控制的最佳方法是啥?