我应如何管理基于XML文档的不同的不兼容formts(How should I manage dif

2019-07-31 01:53发布

我有保存文件(认为word文档)的基于XML的格式的应用 - 从XSD文件生成目前C#类用于读取/写入的文件格式,一切都很好,直到最近,当我不得不做出改变的格式文档。 我关心的是向后兼容性为我的应用程序的未来版本需要能够读取所有以前的版本保存的文件,最好我也希望老版本的我的应用程序能够正常处理读通过我的应用程序的未来版本中保存的文档。

例如,假设我改变我的文档的架构到某个位置添加(可选)额外的元素,那么旧版本我的应用程序将简单地忽略额外elemnt会有任何问题:

<doc>
    <!-- Existing document -->
    <myElement>Hello World!</myElement>
</doc>

但是,如果一个重大更改是由(属性变为例如一个元素,或元素的集合),那么过去我的应用程序的版本应该要么忽略这个元素,如果它是可选的,或者告知他们正试图给用户读取保存,否则我的应用程序的新版本的文件。 也这是目前导致我的头痛为我的应用程序的所有未来版本需要需要读取两个不同的文件完全独立的代码。

这种变化的一个例子是下面的XML:

<doc>
    <!-- Existing document -->
    <someElement contents="12" />
</doc>

更改为:

<doc>
    <!-- Existing document -->
    <someElement>
        <contents>12</contents>
        <contents>13</contents>
    </someElement>
</doc>

为了防止支持头痛,今后我想拿出处理改变我可能会在未来一个体面的策略,让我释放现在要去我的应用程序的版本,以便能够应对这些变化的未来:

  • 如果该文件的“版本号”存储在文档中,如果有的话是什么版本策略应使用? 如果文件版本匹配中的.exe程序集的版本,还是应该更复杂的策略来使用,(例如主要修订变化表明重大的变动,wheras次版本增量显示非破坏性变更 - 例如额外的可选元素)
  • 我应该使用什么方法来读取文件本身,如何避免复制的代码,大量的不同版本的文件?
    • 虽然XPath是显然最灵活的,它不是简单地生成与XSD类来实现更多的工作。
    • 在如果DOM解析被使用,那么就需要在每一个重大更改源代码控制文档XSD的新副本,造成的问题,如果以往任何时候都需要应用到旧的架构(应用程序的旧版本仍然支持)修复另一方面。

另外,我已经工作了这一切非常松耦合的假设,我要让所有变更可以分成这两类“beaking变化”和“不间断的变化”,但我并不完全相信,这是一个安全的假设使。

请注意,我用的术语“文档”非常松散 - 内容不相似的文档了!

感谢您能给我任何意见。

Answer 1:

你一定需要的XML文件中的版本号,我会建议,因为它确实是一个独立的实体,不将其直接连接到应用程序的版本。 您可以通过自己的应用程序中的两个或三个版本,而不千变万化的XML格式,或者你可以结束一个单一版本的开发过程中多次改变格式。

如果你想更旧版本的应用程序,以便能够读取XML文件的更新版本,那么你可以永远,永远删除元素或更改其名称。 您可以随时添加元素和旧代码将愉快地忽略它们(的XML的不错的功能之一),但如果你将其删除,则旧的代码将无法正常工作。

像伊斯梅尔说,XSLT是XML格式从一个版本转换为另一种,这样你就不会解析程序的源代码一大堆风的好方法。



Answer 2:

XSLT是这里一个显而易见的选择。 既然你可以识别你的文档的版本,为您的架构的每个版本,即创造转变以前的版本到新版本的XSLT。

直到到达当前版本可以应用变换的顺序。 因此,你永远只能编辑最新文件版本。 当然,你将无法保存为旧格式,并可以打破文件的旧版本,但是这是典型的多种应用。 如果你绝对需要保存的旧版本,只需创建一个变换,走另一条路。

像@Andy说,使用应用的主要版本号。



Answer 3:

您可以添加到根元素指定版本的属性?

这样,旧版本不会被打破,和你的软件的新版本会看到属性和适当地切换到不同的装载方法。

版本号本身将取决于您的发行频率。 我会亲自去的主要版本号从你的软件,除非你预见的方式变更频率超过了。

编辑 :刚才注意到了有关代码的重复位:

对于我会使用工厂模式,是这样的:

LoadDocument
DoNonVersionDependingLoading
VersionSpecificLoaderFactory(VersionNumber)


文章来源: How should I manage different incompatible formts of Xml based documents