Pre*_*zel 16 c# xml diff merge
此时,我正在管理一个包含多个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>
Run Code Online (Sandbox Code Playgroud)
这是"当前工作"XML:
<Configuration>
<Items>
<Item Id="1" Position="false">
<Location X="123" Y="234" Z="345" />
<Another/>
<Something/>
</Item>
</Items>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
合并后的版本看起来像:
<Configuration>
<Items>
<Item Id="1" Position="true">
<Location X="123" Y="234" Z="345" />
<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
我查看了MS XML Diff和Patch Tool,它肯定将文件合并在一起,但不允许我想要定义的编程规则.
XMLUnit for Java开发人员似乎很有希望,但它的.NET版本似乎还不发达,这是不幸的.
任何人对可编写脚本的XML Diff/Merge工具和/或.NET库(付费或免费)有任何建议吗?
谢谢.
Pre*_*zel 22
经过几天的捣乱,我找到了一个我觉得适合我的解决方案.也许它也适用于其他人.
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();
Run Code Online (Sandbox Code Playgroud)
然后我修改(合并)这个编辑的diffgram对第一个文件,并创建一个部分合并的临时文件.这涉及规则1和2.
接下来,我将部分合并的文件与使用的第一个文件进行了差异化.然后打开新的DiffGram并删除所有对"UseExistingValue"的Change引用.
var newdoc = XDocument.Load(_diffGramFile);
newdoc.Root.DescendantsAndSelf(xd + "change")
.Where(x => x.Value == "UseExistingValue").Remove();
Run Code Online (Sandbox Code Playgroud)
并将此编辑的DiffGram与部分合并的文件合并,该文件负责规则3.将其保存到XML然后根据上面定义的规则生成合并的最终XML.
希望这可以帮助其他人.
提示:安装XmlDiffPatch库后,可以在C:\ Windows\assembly\GAC\XmlDiffPatch\1.0.8.28__b03f5f7f11d50a3a\XmlDiffPatch.dll中找到XmlDiffPatch DLL