C#:检测 XML 文档中的更改

C# : Detecting changes in an XML Document

全部,

我正在从设备获取 XML 文档,如果 XML 文档与旧文档不同,我必须将其上传到网络服务。我不关心 XML 文档中发生了什么变化,我唯一关心的是它发生了变化。我每 10 秒从设备轮询一次此文档,如果它从旧的更改,我上传到网络服务。我没有此文档的架构,因此无法序列化此文档。因此,在这种情况下,检测 XML 文档与前一个文档发生变化的最佳做法是什么。我正在使用 C#6.0 进行开发。

我看到很多关于 XML diff 的建议,但我正在寻找最佳实践,不想过度扼杀我的实施。

谢谢!

您可以随时使用 www.xmlunit.org

具体使用https://github.com/xmlunit/user-guide/wiki/Comparing-XML

XMLUnit 的差异系统将比较两个 XML 的整个过程分解为原子部分。每个这样的部分都表示为一个比较。 Comparison 封装了一种比较类型,如 "the name of an XML element"、"the number of child nodes" 或 "the value of an attribute" 以及要比较的两个部分 - 这两个部分在此上下文中称为 Details 并且了解 DOM 进行比较的节点以及所述节点在各自文档中的 XPath 位置以及手头比较的 WRT 值。对于 "the name of an XML element" 或 "the number of child nodes",DOM 节点将是元素节点,值将分别是元素的 QName/XmlQualifiedName 或数字。

比较只知道比较的是什么,不判断值是否相等。这是由 DifferenceEngine 或 DifferenceEvaluator 决定的。

A Difference 结合了 Comparison 和 DifferenceEvaluator 的决定。在 Difference 对象是 XMLUnit 的 API 的一部分的大多数情况下,假设比较没有导致 EQUAL 结果,因此得名。

Diff 是比较两部分 XML 的总体结果,它是一个可能为空的 Differences 集合的包装器。

final String control = "<a><b attr=\"abc\"></b></a>"; 
final String test = "<a><b attr=\"xyz\"></b></a>";

Diff myDiff = DiffBuilder.compare(Input.fromString(control))
              .withTest(Input.fromString(test))
              .build();

Assert.assertFalse(myDiff.toString(), myDiff.hasDifferences());

https://github.com/xmlunit/user-guide/wiki/DiffBuilder

使用 "XMLDiffPatch" 解决了问题。这非常简单。

  XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
                                    XmlDiffOptions.IgnoreNamespaces |
                                    XmlDiffOptions.IgnorePrefixes);
  bool bIdentical = xmldiff.Compare(originalFile, newFile,  null);

msdn

中的一篇好文章