gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:08:12 26 4
gpt4 key购买 nike

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

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

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

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

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

例如,这里是“源”XML:

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

<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>

这是“当前工作”的 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 and Patch Tool它肯定会将文件合并在一起,但不允许我想要定义的编程规则。

XMLUnit for Java devs看起来很有前途,但它的 .NET 版本似乎开发不足,这很不幸。

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

谢谢。

最佳答案

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

The MS XML Diff and Patch tool是一个可行的选择。当您将第一个文件与第二个文件进行比较时,它会创建一个 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”的所有更改引用。

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

关于c# - C# 中的编程式 XML 差异/合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com