【问题标题】:DiffBuilder - ignore element value but make sure the XML node is presentDiffBuilder - 忽略元素值但确保 XML 节点存在
【发布时间】:2019-08-30 03:22:21
【问题描述】:

我正在使用DiffBuilder 来比较两个 XML 文件。 对于给定的元素 Product,我想检查该元素是否存在,但我想忽略它的值。 可以使用XmlUnit 吗?

无论 Product 元素是否存在,我下面的代码都可以正常工作,这对我的需要不起作用

var differenceBuilder = DiffBuilder
                .Compare(Input.FromDocument(controlXmlFile))
                .WithTest(Input.FromDocument(testXmlDile))
                .WithNodeFilter(n => n.Name != "Product");

【问题讨论】:

    标签: c# unit-testing xmlunit


    【解决方案1】:

    在这种情况下,您不想丢弃节点本身,而是丢弃节点之间的差异。您不会为此使用NodeFilter,而是使用DifferenceEvaluator

    一个非常简化的版本可能是这样的

    .WithDifferenceEvaluator((comparison, outcome) =>
            comparison.ControlDetails.Target.Name == "Product" ? ComparisonResult.EQUAL : outcome
        ) 
    

    但您需要考虑到ControlDetails 可能是null(请查看TestDetails)。如果您的Product 节点有子元素,您可能希望使用NodeFilter 将它们过滤掉,或者检查当前比较目标的任何父节点是否命名为Product

    【讨论】:

    • 谢谢。我最终使用了自己的DifferenceEvaluator,但您的解决方案有效。