我有一个应用程序,从而节省文件(认为word文档)在一个基于Xml格式,目前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组件的版本或应该更加复杂的战略可以使用的,(例如重大修改表明破坏性更改,而次要的修订增量表示不断变化,例如额外的可选要素)
  • 什么方法我应该用来阅读该文件本身和如何避免重复大量的代码,不同版本的文件?
    • 虽然XPath显然是最为灵活,它是一个更多的工作来实施于简单地发生类划.
    • 另一方面,如果DOM分析是使用后一个新的文档的副本文件将需要在来源控制的每个断裂变化,造成的问题,如果修复以往任何时候都需要进适用于老龄模式(旧版本的应用程序都仍然支持)。

此外,我工作了所有的这个非常loosly的假设是,所有的改变,我作可以分成这两种类别的"beaking变化"及"不间断变化",但我不能完全相信,这是一个安全的假设。

注意,我使用的术语"文件"非常松散的内容不像一个文件。

谢谢你的任何建议你可以给我。

有帮助吗?

解决方案

你肯定需要一个版本的数量在XML文件,我建议不将它版本的应用程序,因为它真的是一个单独的实体。你可以通过两个或三个版本的应用不断变化的XML格式或者你可能改变格式,多次在发展一个单一的释放。

如果你想要旧版本的应用程序,能够阅读的新版本XML文件,然后你可以永远,永远消除元或更改其名称。你总是可以添加元和老年码愉快地将它们忽略(一个很好的特性的XML)但是,如果你移除他们那么旧的代码不能功能。

像伊斯梅尔说,XSLT是一个很好的方式转换的XML格式,从一个到另一个版本,以便你不会有一大堆的分析程序的源码。

其他提示

XSLT是一个明显的选择在这里。鉴于你可以识别的版本的文件,对于每个版本的你的架构,创造一个XSLT,将以前的版本给你的新版本。

你可以申请转换顺序,直到你达到目前的版本。因此你是唯一曾经编辑的最新文献的版本。当然,将无法保存的古老的格式,并可以打破文件的旧版本,但这是典型的许多应用程序。如果你绝对需要保存的旧版本,只要创建一个变换去的其他方式。

像@Andy说,使用的主要建立数量的应用。

你可以添加的一个属性的根元指定的版本吗?

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

版本的编号本身将取决于你的频率释放。我会亲自去主要的生成量,从你的软件,除非你预见的格式改变的更加频繁。

编辑:只注意到了关于重复代码:

对,我将使用工厂的模式,事情是这样的:

LoadDocument
DoNonVersionDependingLoading
VersionSpecificLoaderFactory(VersionNumber)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top