c#中的编程XML Diff / Merge

本文关键字:Diff Merge XML 编程 | 更新日期: 2023-09-27 17:53:32

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

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

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

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

  1. 如果当前工作XML有一个源XML没有的节点,删除它。
  2. 如果源XML有当前工作XML没有的节点,则添加它。
  3. 如果两者具有相同的节点且值不同,则支持源XML的值,除非源XML的值设置为"UseExistingValue"。

例如,下面是"Source" XML:

<Configuration>
  <Items>
     <Item Id="1" Position="true">
       <Location X="UseExistingValue" Y="UseExistingValue" Z="UseExistingValue" />
       <Something/>
       <SomethingElse/>
     </Item>
   </Items>
 </Configuration>

下面是"Current Working" XML:

<Configuration>
  <Items>
    <Item Id="1" Position="false">
      <Location X="123" Y="234" Z="345" />
      <Another/>
      <Something/>
    </Item>
  </Items>
</Configuration>

合并后的版本看起来像:

<Configuration>
  <Items>
    <Item Id="1" Position="true">
      <Location X="123" Y="234" Z="345" />
      <Something/>
      <SomethingElse/>
    </Item>
  </Items>
</Configuration>

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

Java开发人员的XMLUnit似乎很有前途,但它的。net版本似乎不发达,这是不幸的。

谁有任何建议,无论是脚本XML Diff/合并工具和/或。net库(付费或免费)?

谢谢。

c#中的编程XML Diff / Merge

经过几天的折腾,我找到了一个我认为适合我的解决方案。也许这对其他人也有用。

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

为了处理我上面列出的所有3条规则,我在一个方向上对两个文件进行了Diff,然后使用Linq-to-XML打开DiffGram文件并删除了所有的"Add"answers"Remove"行。

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"的更改引用。

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

并将这个编辑过的DiffGram与部分合并的文件合并,这符合规则3。然后将其保存为XML,生成根据上面定义的规则合并的最终XML。

希望这能帮助到其他人。

提示:安装XmlDiffPatch库后,XmlDiffPatch DLL可以在C:'Windows'assembly'GAC'XmlDiffPatch'1.0.8.28__b03f5f7f11d50a3a'XmlDiffPatch. DLL