8

我有一些单元测试需要确保方法生成的 XML 包含与预期 Xml 文档相同的元素/值。

我在 Java 中使用了 xmlunit,虽然它们有一个 .net 版本,但它似乎不支持命名空间。.net 中是否有任何替代方法可以做到这一点?

只要我可以比较 2 个 Xml 字符串并得到一个真/假结果来告诉我它们是否匹配就包含的数据而言,我很高兴......

4

4 回答 4

7

我通常发现XNode.DeepEquals足以满足我的需求。它是 BCL 的一部分,因此无需下载。

于 2011-05-05T12:33:29.357 回答
3

试试 Microsoft.XmlDiffPatch:

static public bool IsXmlEqual( XmlReader x1, XmlReader x2,
    bool IgnoreChildOrder, bool IgnoreComments, bool IgnorePI, bool IgnoreWhitespace,
    bool IgnoreNamespaces, bool IgnorePrefixes, bool IgnoreXmlDecl, bool IgnoreDtd
)
{
    XmlDiffOptions options = XmlDiffOptions.None;
    if (IgnoreChildOrder) options |= XmlDiffOptions.IgnoreChildOrder;
    if (IgnoreComments) options |= XmlDiffOptions.IgnoreComments;
    if (IgnorePI) options |= XmlDiffOptions.IgnorePI;
    if (IgnoreWhitespace) options |= XmlDiffOptions.IgnoreWhitespace;
    if (IgnoreNamespaces) options |= XmlDiffOptions.IgnoreNamespaces;
    if (IgnorePrefixes) options |= XmlDiffOptions.IgnorePrefixes;
    if (IgnoreXmlDecl) options |= XmlDiffOptions.IgnoreXmlDecl;
    if (IgnoreDtd) options |= XmlDiffOptions.IgnoreDtd;

    XmlDiff xmlDiff = new XmlDiff(options);
    bool bequal = xmlDiff.Compare(x1, x2, null);
    return bequal;
}
于 2011-05-05T12:19:16.073 回答
1

关于 MSXML XMLDiff 要记住的一点是,如果您要比较非常大的 XML 文档,请确保您XMLDiff.Algorithm没有设置为“精确”,否则您可能会耗尽内存。默认情况下,它设置为 Auto,这是一个安全的选择,因为 API 将根据文件大小、检测到的差异数量和其他因素选择是使用 Precise 还是 Fast。对于更倾向于技术的人来说,这是一本不错的读物:

http://treepatch.sourceforge.net/report.pdf

于 2011-11-08T18:52:49.280 回答
0

我过去使用过 MS 的 XMLDiff,但更喜欢使用 Beyond Compare 3,因为它具有更好的 GUI 和批处理功能(虽然没有 .NET API)。

对于您的测试,使用 XNode.DeepEquals 或 InnerXML 来比较基于字符串的表示

于 2011-05-05T13:12:12.353 回答