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

时间:2017-01-08 15:06:58

标签: c# xml diff

所有

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

我已经看到很多关于XML差异的建议,但我正在寻找最佳实践,并且不想过度杀死我的实现。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

XMLUnit的diff系统打破了将两个XML比较为原子部分的整个过程。每个这样的部分都表示为比较。比较封装了一种比较类型,如“XML元素的名称”,“子节点的数量”或“属性的值”以及要比较的两个部分 - 这两个部分在此处称为详细信息上下文并了解要比较的DOM节点以及各自文档中所述节点的XPath位置以及手头比较的值WRT。对于“XML元素的名称”或“子节点的数量”,DOM节点将是元素节点,值将分别是元素的QName / XmlQualifiedName或数字。

比较只知道比较的是什么,它不判断值是相同还是不同。这是由DifferenceEngine或更确切地说是DifferenceEvaluator决定的。

差异将比较与DifferenceEvaluator的决定结合起来。在差异对象是XMLUnit API的一部分的大多数情况下,假设比较没有导致EQUAL结果,因此得名。

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

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

答案 1 :(得分:1)

使用&#34; XMLDiffPatch&#34;解决了这个问题。这很直接。

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

msdn

中的一篇好文章