所有
我从设备获取XML文档,如果XML文档从旧文档更改,我必须上传到Web服务。我不关心XML文档中发生了什么变化,只关心它改变了。我每10秒钟从设备上查看一次这个文件,如果它从旧版本更改,我会上传到网络服务。我没有此文档的架构,因此我无法对此文档进行序列化。因此,在这种情况下,检测XML文档是否从前一个更改的最佳做法是什么。我正在使用C#6.0进行开发。
我已经看到很多关于XML差异的建议,但我正在寻找最佳实践,并且不想过度杀死我的实现。
谢谢!
答案 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());
答案 1 :(得分:1)
使用&#34; XMLDiffPatch&#34;解决了这个问题。这很直接。
XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
XmlDiffOptions.IgnoreNamespaces |
XmlDiffOptions.IgnorePrefixes);
bool bIdentical = xmldiff.Compare(originalFile, newFile, null);
中的一篇好文章