- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
此刻,我正在管理一个具有多个 XML 配置文件的软件。当发布新版本的软件时,有时基本配置文件会更改,我们目前有软件调用 KDiff在启动时。如果检测到更改,它会提示用户选择更改。
这种方法的问题是 KDiff 是一个行比较程序,不了解 XML 的方式(如节点等)
理想情况下,我想以编程方式使用 C# 中的库(因为我们是一家 MS 商店),它可以区分两个 XML 文件:一个源 XML 和一个当前工作的 XML。
然后使用一些简单的规则将两者合并在一起:
例如,这里是“源”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/
我是一名优秀的程序员,十分优秀!