【问题标题】:How to print ALL the discrepencies between two XML documents如何打印两个 XML 文档之间的所有差异
【发布时间】:2018-09-23 05:07:00
【问题描述】:

我刚刚发现了这个不错的工具 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() 只显示遇到的第一个差异。 有没有办法全部显示?

【问题讨论】:

  • 您尝试过 XML Diff 工具吗?

标签: c# xmlunit


【解决方案1】:

我刚刚找到了解决办法

Assert.IsFalse(myDiff.HasDifferences(), string.Join(Environment.NewLine, myDiff.Differences));

【讨论】:

    【解决方案2】:

    我假设您正在使用 xmlunit.net 库(您没有说出您找到的工具的名称,但您的示例似乎匹配)。

    您可以搜索他们的 GitHub 存储库并找到 DiffBuilder 类文件。如果您查看 Build 方法,您将看到它返回一个 Diff 对象。如果你去Diff类文件你会发现它的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() 只返回一个差异(.First() 调用)。如果您查看该类,您会发现有一个名为 Differences 的公共属性,它将该字段公开为 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 类的 ToString 代码中获得了用于格式化差异的语法。另请注意,我在您的示例中添加了第二个属性,以证明这确实显示了所有差异。

    【讨论】:

    • 正确,我忘了提到工具,我已经更新了我的问题和答案;-)
    猜你喜欢
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多