保存和恢复xml差异

时间:2010-01-13 15:44:44

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

我使用的是asp.net和.net framework 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>

模板是通用的,对许多用户来说都是通用的,然后有实际,这是针对个别用户的。

我想提取实际模板之间的增量,使其可以独立保存,然后重新应用到 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 /补丁功能。如果没有,那么就可以通用的方式解决上述问题,以免在xml发生变化时中断。

由于

2 个答案:

答案 0 :(得分:1)

我认为你可能过度工程了。虽然差异/补丁工具可以满足您的需求,但在我看来,不太通用的东西也可以满足您的需求。

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

鉴于这些约束,可能的差异集很容易描述:它只是每个问题下<answer/>元素的内容。这比通用的diff实用程序更容易推理。

答案 1 :(得分:0)

我从以下网址获取了Microsoft的xmlDiffPatch包: http://download.microsoft.com/download/xml/Patch/1.0/WXP/EN-US/xmldiffpatch.exe

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