【问题标题】:Count how many differences in 2 XML files计算 2 个 XML 文件有多少差异
【发布时间】:2014-09-30 01:23:46
【问题描述】:

想象一个 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) 第一个 XML 中缺少 node5

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

架构:
名为“foo”的根和一组具有一个值的子节点。

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

【问题讨论】:

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


    【解决方案1】:

    您是否考虑过使用 XNode.DeepEquals,将每个 XML 文件的根(在本例中为“foo”)作为您的节点?关于如何使用它的 MSDN 页面在这里:

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

    【讨论】:

    • 我刚刚在读到这个。所以如果我通过根,它会告诉我真/假,但不会告诉我有多少不同。那正确吗?我想对于我想在第一个 XML 上测试的每个节点,一定有比扫描第二个 XML 更好的方法,反之亦然,以便找出有多少差异。
    • 我读过的关于该主题的大部分参考资料都回到 XMLDiff 作为该主题的主要权威。由于您已经用尽了这条途径,DeepEquals 在技术上是另一种选择,但是是的,您最终可能会使用自定义脚本扫描每个节点以获得所需的信息。
    • 我可能会专注于寻找有关如何“解释” XMLDiff 结果的示例...谢谢!!
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢您的提示。也许我可以使用 XQuery。您是否知道生成这些 XPath 的正确方法是什么?
    • 如果您想以显示的形式生成它们,string-join(ancestor-or-self::*/name(), '/') 可以帮助您完成大部分工作。但是你必须考虑如何处理命名空间。
    猜你喜欢
    • 2015-04-02
    • 2014-07-21
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2019-06-20
    • 2021-04-25
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多