Nei*_*ski 60 .net c# xml xmldocument compare
作为一些广泛的单元测试的基类的一部分,我正在编写一个辅助函数,它在C#(.NET)中递归地将一个XmlDocument对象的节点与另一个XmlDocument对象的节点进行比较.一些要求:
xsi:schemaLocation和xmlns:xsi,虽然我希望能够通过在哪些.InnerText,但不能同时.虽然我正在废弃一些东西:有没有人写过这样的代码,是否有可能在这里分享?
顺便说一下,你会把第一个和第二个文件称为什么?我一直把它们称为"源"和"目标",但它感觉不对,因为源是我希望目标看起来像,否则我抛出异常.
Dan*_*mal 54
Microsoft有一个可以使用的XML diff API
今天我搜索了一个更完整的问题解决方案列表,我将很快尝试其中一个:
小智 6
这段代码不能满足您的所有要求,但它很简单,我正在用于我的单元测试。属性顺序无关紧要,但元素顺序很重要。不比较元素内部文本。我在比较属性时也忽略了大小写,但您可以轻松删除它。
public bool XMLCompare(XElement primary, XElement secondary)
{
if (primary.HasAttributes) {
if (primary.Attributes().Count() != secondary.Attributes().Count())
return false;
foreach (XAttribute attr in primary.Attributes()) {
if (secondary.Attribute(attr.Name.LocalName) == null)
return false;
if (attr.Value.ToLower() != secondary.Attribute(attr.Name.LocalName).Value.ToLower())
return false;
}
}
if (primary.HasElements) {
if (primary.Elements().Count() != secondary.Elements().Count())
return false;
for (var i = 0; i <= primary.Elements().Count() - 1; i++) {
if (XMLCompare(primary.Elements().Skip(i).Take(1).Single(), secondary.Elements().Skip(i).Take(1).Single()) == false)
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
为了比较自动化测试中的两个 XML 输出,我发现了XNode.DeepEquals.
比较两个节点的值,包括所有后代节点的值。
用法:
var xDoc1 = XDocument.Parse(xmlString1);
var xDoc2 = XDocument.Parse(xmlString2);
bool isSame = XNode.DeepEquals(xDoc1.Document, xDoc2.Document);
//Assert.IsTrue(isSame);
Run Code Online (Sandbox Code Playgroud)
参考:https://learn.microsoft.com/en-us/dotnet/api/system.xml.linq.xnode.deepequals ?view=netcore-2.2
比较XML文档很复杂.谷歌为xmldiff(甚至是微软的解决方案)提供一些工具.我已经通过几种方式解决了这个问题.我使用XSLT对元素和属性进行排序(因为有时它们会以不同的顺序出现,我不关心它),并过滤掉我不想比较的属性,然后使用XML :: Diff或XML :: SemanticDiff perl模块,或者在每个文档上打印相当于每个元素和属性的单独行,并在结果上使用Unix命令行diff.
https://github.com/CameronWills/FatAntelope Microsoft XML Diff API 的另一个替代库。它具有 XML 比较算法,可以对两个 XML 文档进行无序比较并产生最佳匹配。
它是此处描述的 X-Diff 算法的 C# 端口: http://pages.cs.wisc.edu/~yuanwang/xdiff.html
免责声明:我写的:)