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

C#:检测XML文档中的更改,c#,xml,diff,C#,Xml,Diff,全部, 我从一台设备上获取一个XML文档,如果XML文档从旧文档更改,我必须将其上载到Web服务。我不关心XML文档中发生了什么变化,我唯一关心的是它发生了变化。我每10秒从设备中轮询一次此文档,如果它从旧文档更改,我将上载到Web服务。我没有此文档的架构,因此无法序列化此文档。因此,在本例中,检测XML文档与以前的文档发生更改的最佳实践是什么。我正在使用C#6.0进行开发 我已经看到了很多关于XMLDiff的建议,但我正在寻找一种最佳实践,不想过度破坏我的实现 谢谢 您可以随时使用www.xm

全部,

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

我已经看到了很多关于XMLDiff的建议,但我正在寻找一种最佳实践,不想过度破坏我的实现


谢谢

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

具体使用

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

比较只知道要比较的是什么,它不能判断值是否相等或不同。这是由差异引擎或差异评估器决定的

差异将比较与差异评估者的决定相结合。在大多数情况下,如果差异对象是XMLUnit API的一部分,则假定比较不会导致相同的结果,因此得名

差异是比较两段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());
final String control=“

使用“XMLDiffPatch”解决了这个问题。这非常简单

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

文档有多大?我认为太大了,无法使用String.Equals?@Chris考虑到“每10秒从设备上轮询一次此文档”“这可能不是问题所在。也许,设备上的序列化可能会产生相同的数据,但会有额外的空格和不同的元素顺序,这会阻止直接比较方法。@EugenePodskal:这是真的。我假设文档每次都是由同一个东西生成的,所以像空白这样的东西不会改变,但你可能是对的。有时候,虽然人们确实忽略了简单的选项,所以它总是值得一问。我假设您想知道XML是否真的不同。如果您只是关心文档是否与以前的获取不同,请计算哈希并进行比较。