【问题标题】:saving and restoring xml differences保存和恢复 xml 差异
【发布时间】:2010-01-13 15:44:44
【问题描述】:

我正在使用 asp.net 和 .net 框架 2.0。如果解决方案足够引人注目,我也许可以将服务器升级到 3.5。 这就是问题所在。

我有两个 xml。 我将第 1 件称为 模板,将第 2 件称为 实际

这是一个基本的例子:

模板

<questions>
 <question1 msg="1234">
   <answer></answer>
 </question1>
 <question2 msg="1235">
   <answer></answer>
 </question2>
 <question3 msg="">
   <answer></answer>
 </question3>
</questions>

实际

<questions>
 <question1 msg="1234">
   <answer>foo</answer>
 </question1>
 <question2 msg="1235">
   <answer>bar</answer>
 </question2>
 <question3 msg="dynamic">
   <answer>blob</answer>
 </question3>
</questions>

模板是通用的,对许多用户来说是通用的,然后是实际的,它是特定于个人用户的。

我想提取 actualtemplate 之间的差异,以便可以独立保存然后重新应用于 template 以获得 实际 xml 的完整表示。

我做了一些查找,发现了一个适用于 .net 1.0 的“XML Diff and Patch”工具,看起来它几乎完全符合我的需要,但后来我发现了一些其他对它的引用,似乎表明它有从雷达上掉下来。 http://msdn.microsoft.com/en-us/library/aa302294.aspx

我还发现了一些示例,它们依赖于特定的 xml 结构来手动提取 xml 表示的实体之间的差异。我通常对这种解决方案感到不舒服,并且真的更喜欢一种更通用的解决方案,它能够适应对 xml 所做的更改。

理想情况下,我很想在某个地方找到 .net2.0/3.5 中内置的 xmldiff/patch 功能。如果没有,那么以足够通用的方式解决上述问题,当 xml 更改时它不会中断。

谢谢

【问题讨论】:

    标签: .net asp.net xml vb.net


    【解决方案1】:

    我认为您可能对此进行了过度设计。虽然 diff/patch 工具可能会满足您的需求,但在我看来,不太通用的东西也能满足您的需求。

    在您的示例中,&lt;answer/&gt; 标记始终存在于模板中,并且始终为空且没有属性。 &lt;questions/&gt; 标记的所有子元素的名称都以“question”开头,并且它们都有一个msg 属性,其值为整数或空白。如果是整数,则其值与“实际”文件中的相应值匹配,但如果为空,则可以匹配“动态”。

    鉴于这些限制,描述可能的差异集要简单得多:它只是每个问题下&lt;answer/&gt; 元素的内容。这比通用 diff 实用程序更容易推理。

    【讨论】:

    • 嗨 John 感谢您的回答,但您列出的限制是我简化示例的产物,在我的实际情况下并不可靠。真正的 xml 比示例具有更多的可变性。可能值得注意的一个约束是“实际”的结构将始终存在于“模板”中
    • @Todd:还是不错的。这意味着永远不会有与结构有关的差异,只有内容。因此,如果实际情况更复杂,那么将我给出的解决方案复杂化。例如,“实际”中可能存在“模板”中不存在的属性?您似乎仍然不需要差异/补丁工具的全部通用性。
    • 也许你是对的,约翰。我将更认真地调查这个选项。顺便说一句,除了“模板”中不存在“实际”中的节点的可能性之外,我没有想出什么来打破你的概念。尽管在我看来,依赖于 xml 内容形状的解决方案不那么简单而且更脆弱,因为处理差异/修补的代码可能需要响应 xml 内容的变化。这似乎是一种不太明显的关系,可能会变得难以管理和维护。
    • @Toss:总的来说,我的意思是,由于您拥有模板和实际文档,因此可以从您对这些文档的了解开始。如果有一种简单的方法来表示可能的增量,那么这就是要走的路。如果没有简单的方法来做到这一点,那么您需要一个通用的 diff 算法。
    • 所以问题仍然存在。你知道我在哪里可以找到这样的通用差异/补丁功能。如果它是在 .net 1.0 中构建的,它一定在某个地方?
    【解决方案2】:

    我通过以下 url 从 Microsoft 获得了 xmlDiffPatch 包: http://download.microsoft.com/download/xml/Patch/1.0/WXP/EN-US/xmldiffpatch.exe

    它在我的 .net 2.0 解决方案中完美运行。 使用这种技术,我能够将存储的数据量减少到我们之前需要存储的数据量的 2% 到 25% 之间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2015-12-17
      • 2016-05-01
      相关资源
      最近更新 更多