计算2个XML文件中的差异

时间:2014-08-06 23:05:31

标签: c# xml xml-parsing linq-to-xml

想象一个XML为:

<foo>
  <node1>Some value</node1>
  <node2>BB</node2>
  <node3>TTTTT</node3>
  <node4>XXXX</node4>
</foo>

和另一个XML:

<foo>
  <node1>Something Else</node1>
  <node4>XXXX</node4>
  <node5>TTTTT</node5>
</foo>

此处差异计数 3
  a)node1值不同
  b)第二个XML中缺少node2   c)1st XML中缺少node5

我尝试过使用XMLDiff类,但结果对我的需求来说太麻烦了。

架构:
Root命名为“foo”和一组子项,每个子项都有一个值。

问题:
用C#编写代码的最简单,最快捷的方法是什么?

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用XNode.DeepEquals,每个XML文件的根(在这种情况下&#39; foo&#39;)是您的节点?关于如何使用它的MSDN页面在这里:

http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.deepequals.aspx

答案 1 :(得分:1)

执行此操作的一种方法可能是从第一个文档生成XPath断言列表,格式如下:

/foo/node1 = "Some value"
/foo/node2 = "BB"
/foo/node3 = "TTTT"
/foo/node4 = "XXXX"

然后将这些断言应用于第二个文档,以计算其中有多少是真的。因为这不会捕获第一个文档中不存在并且存在于第二个文档中的数据,所以您可能也希望执行反向操作。当然,它并不完美,例如它不会捕捉元素顺序的差异。但是你实际上并没有通过显着差异来定义你的意思,你可以调整XPath表达式来断言你认为重要的东西。例如,您可以将最后一个断言改为:

count(/foo/node4[. = "XXXX"]) = 1

当然,最简单,最快速的编码方式不在于C#,除非它恰好是您所知道的唯一编程语言。使用XSLT或XQuery会好得多。