我应该如何管理基于Xml的文档的不同不兼容的形式

Jus*_*tin 5 c# xml schema xsd xmldocument

我有一个应用程序,它以基于Xml的格式保存文档(想想word文档) - 目前从xsd文件生成的C#类用于读取/写入文档格式,直到最近我必须更改格式该文件.我担心的是后向兼容性,因为我的应用程序的未来版本 需要能够读取所有以前版本保存的文档,理想情况下我还希望我的应用程序的旧版本能够优雅地处理阅读未来版本的应用程序保存的文档.

例如,假设我更改了我的文档的模式以在某处添加(可选的)额外元素,那么我的应用程序的旧版本将忽略额外的元素并且不会出现问题:

<doc>
    <!-- Existing document -->
    <myElement>Hello World!</myElement>
</doc>
Run Code Online (Sandbox Code Playgroud)

但是,如果进行了重大更改(例如,将属性更改为元素或元素集合),那么我的应用程序的过去版本应该忽略此元素(如果它是可选的),或者通知用户他们正在尝试请阅读使用我的应用程序的较新版本保存的文档.此外,这使我头疼,因为我的应用程序的所有未来版本需要完全单独的代码才能阅读两个不同的文档.

这种变化的一个例子是以下xml:

<doc>
    <!-- Existing document -->
    <someElement contents="12" />
</doc>
Run Code Online (Sandbox Code Playgroud)

改为:

<doc>
    <!-- Existing document -->
    <someElement>
        <contents>12</contents>
        <contents>13</contents>
    </someElement>
</doc>
Run Code Online (Sandbox Code Playgroud)

为了防止将来出现支持问题,我想提出一个合适的策略来处理我将来可能做出的更改,以便我现在发布的应用程序版本能够应对这些变化.未来:

  • 文档的"版本号"是否应该存储在文档中,如果是,应该使用哪种版本控制策略?如果文档版本与.exe程序集版本匹配,或者应该使用更复杂的策略,(例如,主要修订版本更改表示重大更改,则较小的修订版增量表示不间断更改 - 例如额外的可选元素)
  • 我应该使用什么方法来阅读文档本身,以及如何避免为不同版本的文档复制大量代码?
    • 尽管XPath显然最灵活,但实现起来要比使用xsd生成类要多得多.
    • 另一方面,如果使用DOM解析,则在源控件中需要每个重大更改的文档xsd的新副本,如果需要将修复程序应用于较旧的模式,则会导致问题(仍支持旧版本的应用程序) .

另外,我假设我所做的所有改变都可以分为"喙变化"和"不间断的变化"这两类,我已经非常松散地工作了所有这些,但我并不完全相信这是一个安全的假设制作.

请注意,我非常宽松地使用术语"文档" - 内容根本不像文档!

感谢您提供给我的任何建议.

17 *_* 26 4

您肯定需要 XML 文件中的版本号,我建议不要将其与应用程序的版本绑定,因为它实际上是一个单独的实体。您可能会使用应用程序的两个或三个版本而无需更改 XML 格式,或者您可能会在单个版本的开发过程中多次更改格式。

如果您希望旧版本的应用程序能够读取新版本的 XML 文件,那么您永远不能删除元素或更改它们的名称。您始终可以添加元素,旧代码会很乐意忽略它们(XML 的优秀功能之一),但如果删除它们,则旧代码将无法运行。

正如 Ishmael 所说,XSLT 是将 XML 格式从一个版本转换为另一个版本的好方法,这样您就不会在源代码中遇到一大堆解析例程。