C#中的编程XML差异/合并

此时,我正在管理一个包含多个XML配置文件的软件。 当发布新版本的软件时,有时基本配置文件会发生变化,我们目前在启动时会调用KDiff软件。 如果检测到更改,则会提示用户选择更改。

这种方法的问题是KDiff是一个比较程序的行,而不是知道XML的方式(如节点等)

理想情况下,我希望以编程方式使用C#中的库(因为我们是一个MS商店),它可以扩展两个XML文件:源XML和当前工作XML。

然后使用一些简单的规则将两者合并在一起:

  1. 如果当前工作XML具有源XML不具有的节点,请将其删除。
  2. 如果源XML具有当前工作XML不具有的节点,请添加它。
  3. 如果两者具有相同的节点且值不同,则支持Source XML的值,除非Source XML的值设置为“UseExistingValue”。

例如,这是“源”XML:

         

这是“当前工作”XML:

          

合并后的版本看起来像:

          

我查看了MS XML Diff和Patch Tool ,它肯定将文件合并在一起,但不允许我想要定义的编程规则。

XMLUnit for Java开发人员看起来很有希望,但它的.NET版本似乎不发达,这是不幸的。

任何人对可编写脚本的XML Diff / Merge工具和/或.NET库(付费或免费)有任何建议吗?

谢谢。

经过几天的捣乱,我找到了一个我觉得适合我的解决方案。 也许它也适用于其他人。

MS XML Diff和Patch工具是一个可行的选择。 当您针对第二个文件对第一个文件进行Diff时,它会创建一个XML“DiffGram”,列出它在两个XML文件之间检测到的更改。

为了处理上面列出的所有3条规则,我在一个方向上对两个文件进行了差异,然后使用Linq-to-XML打开了DiffGram文件,并删除了所有“添加”和“删除”行。

 XNamespace xd = "http://schemas.microsoft.com/xmltools/2002/xmldiff"; var doc = XDocument.Load(_diffGramFile); doc.Root.DescendantsAndSelf(xd + "add").Remove(); doc.Root.DescendantsAndSelf(xd + "remove").Remove(); 

然后,我将这个编辑过的diffgram修补(合并)到第一个文件,并创建了一个部分合并的临时文件。 这涉及规则1和2。

接下来,我将部分合并的文件与使用的第一个文件进行差异化。 然后打开新的DiffGram并删除所有对“UseExistingValue”的Change引用。

 var newdoc = XDocument.Load(_diffGramFile); newdoc.Root.DescendantsAndSelf(xd + "change") .Where(x => x.Value == "UseExistingValue").Remove(); 

并将此编辑过的DiffGram与部分合并的文件合并,该文件负责规则3.将其保存到XML然后根据上面定义的规则生成最终的XML合并。

希望这可以帮助其他人。

提示:安装XmlDiffPatch库后,可以在C:\ Windows \ assembly \ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll中找到XmlDiffPatch DLL