代码之家  ›  专栏  ›  技术社区  ›  ZeroBugBounce

如何管理基于Xml的文档的不同不兼容格式

  •  5
  • ZeroBugBounce  · 技术社区  · 6 年前

    我有一个应用程序,它以基于Xml的格式保存文档(比如word文档)——目前从xsd文件生成的C#类用于读取/写入文档格式,直到最近我不得不更改文档格式时,一切都很好。我关心的是作为我的应用程序的未来版本的向后兼容性 需要

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

    <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显然是最灵活的,但它的实现比简单地用xsd生成类要复杂得多。
      • 另一方面,如果使用DOM解析,那么在源代码管理中,每次中断的更改都需要一个新的文档xsd副本,如果需要将修复应用于旧模式(仍支持旧版本的应用程序),则会导致问题。

    此外,我在假设我所做的所有更改都可以分为两类,即“尖刻更改”和“非破坏性更改”,但我并不完全相信这是一个安全的假设。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Ishmael    16 年前

    可以按顺序应用变换,直到达到当前版本。因此,您只能编辑最新的文档版本。当然,您将无法保存为旧格式,并且可能会破坏旧版本的文档,但这是许多应用程序的典型情况。如果您确实需要保存到旧版本,只需创建一个相反的转换。

        2
  •  4
  •   17 of 26    16 年前

    您肯定需要XML文件中的版本号,我建议不要将其绑定到应用程序的版本,因为它实际上是一个单独的实体。您可以在不更改XML格式的情况下浏览应用程序的两个或三个版本,也可以在开发单个版本的过程中多次更改格式。

    如果希望较旧版本的应用程序能够读取较新版本的XML文件,则永远不能删除元素或更改其名称。您总是可以添加元素,旧代码会很高兴地忽略它们(XML的一个很好的特性),但是如果您删除它们,旧代码将无法正常工作。

        3
  •  0
  •   Pondidum    16 年前

    是否可以向根元素添加一个属性来指定版本?

    版本编号本身取决于您的发布频率。我个人会使用你的软件的主要版本号,除非你预见到格式的变化更频繁。

    编辑

    为此,我将使用工厂模式,类似于这样:

    LoadDocument
    DoNonVersionDependingLoading
    VersionSpecificLoaderFactory(VersionNumber)