如何打印两个 XML 文档之间的所有差异
How to print ALL the discrepencies between two XML documents
我刚刚发现了这个不错的工具 XmlUnit,它允许我评估 2 个不同的 XML 文档并显示最终的差异。
string control = "<a><b attr=\"abc\"></b></a>";
string test = "<a><b attr=\"xyz\"></b></a>";
var myDiff = DiffBuilder.Compare(Input.FromString(control))
.WithTest(Input.FromString(test))
.Build();
Assert.IsFalse(myDiff.HasDifferences(), myDiff.ToString());
但是,我发现 myDiff.ToString()
只显示遇到的第一个差异。
有没有办法全部显示出来?
我刚刚找到解决方案
Assert.IsFalse(myDiff.HasDifferences(), string.Join(Environment.NewLine, myDiff.Differences));
我假设您正在使用 xmlunit.net 库(您没有说出您找到的工具的名称,但您的示例似乎匹配)。
您可以搜索他们的 GitHub 存储库并找到 DiffBuilder class file. If you look at the Build method you will see it returns a Diff object. If you go to the Diff class 文件,您会发现它的 ToString 方法如下所示。
public override string ToString() {
return ToString(formatter);
}
这并没有告诉你很多,但如果你转到另一个 ToString 重载,你会发现这个。
public string ToString(IComparisonFormatter formatter) {
if (!HasDifferences()) {
return "[identical]";
}
return differences.First().Comparison.ToString(formatter);
}
现在我们有所进展。我们现在知道 Diff 将其差异列表存储在私有差异字段中,以及为什么 ToString() 仅 returns 一个差异(.First() 调用)。如果您查看 class,您会发现有一个名为 Differences 的 public 属性,它将该字段公开为 IEnumerable。因此,获得所有差异的方法是遍历 属性 并像这样收集所有差异。
string control = "<a><b attr=\"abc\" attr2=\"123\"></b></a>";
string test = "<a><b attr=\"xyz\" attr2=\"987\"></b></a>";
var myDiff = DiffBuilder.Compare(Input.FromString(control))
.WithTest(Input.FromString(test))
.Build();
var sb = new StringBuilder();
foreach(var dif in myDiff.Differences)
{
sb.AppendLine(dif.Comparison.ToString());
}
Assert.IsFalse(myDiff.HasDifferences(), sb.ToString());
请注意,我从 Diff class 的 ToString 代码中获得了格式化差异的语法。另请注意,我向您的示例添加了第二个属性,以证明这确实显示了所有差异。
我刚刚发现了这个不错的工具 XmlUnit,它允许我评估 2 个不同的 XML 文档并显示最终的差异。
string control = "<a><b attr=\"abc\"></b></a>";
string test = "<a><b attr=\"xyz\"></b></a>";
var myDiff = DiffBuilder.Compare(Input.FromString(control))
.WithTest(Input.FromString(test))
.Build();
Assert.IsFalse(myDiff.HasDifferences(), myDiff.ToString());
但是,我发现 myDiff.ToString()
只显示遇到的第一个差异。
有没有办法全部显示出来?
我刚刚找到解决方案
Assert.IsFalse(myDiff.HasDifferences(), string.Join(Environment.NewLine, myDiff.Differences));
我假设您正在使用 xmlunit.net 库(您没有说出您找到的工具的名称,但您的示例似乎匹配)。
您可以搜索他们的 GitHub 存储库并找到 DiffBuilder class file. If you look at the Build method you will see it returns a Diff object. If you go to the Diff class 文件,您会发现它的 ToString 方法如下所示。
public override string ToString() {
return ToString(formatter);
}
这并没有告诉你很多,但如果你转到另一个 ToString 重载,你会发现这个。
public string ToString(IComparisonFormatter formatter) {
if (!HasDifferences()) {
return "[identical]";
}
return differences.First().Comparison.ToString(formatter);
}
现在我们有所进展。我们现在知道 Diff 将其差异列表存储在私有差异字段中,以及为什么 ToString() 仅 returns 一个差异(.First() 调用)。如果您查看 class,您会发现有一个名为 Differences 的 public 属性,它将该字段公开为 IEnumerable。因此,获得所有差异的方法是遍历 属性 并像这样收集所有差异。
string control = "<a><b attr=\"abc\" attr2=\"123\"></b></a>";
string test = "<a><b attr=\"xyz\" attr2=\"987\"></b></a>";
var myDiff = DiffBuilder.Compare(Input.FromString(control))
.WithTest(Input.FromString(test))
.Build();
var sb = new StringBuilder();
foreach(var dif in myDiff.Differences)
{
sb.AppendLine(dif.Comparison.ToString());
}
Assert.IsFalse(myDiff.HasDifferences(), sb.ToString());
请注意,我从 Diff class 的 ToString 代码中获得了格式化差异的语法。另请注意,我向您的示例添加了第二个属性,以证明这确实显示了所有差异。