【问题标题】:Ignoring a particular attribute of a specific Node while comparing xml files using XMLUnit 2.X使用 XMLUnit 2.X 比较 xml 文件时忽略特定节点的特定属性
【发布时间】:2019-04-03 13:46:32
【问题描述】:

我有两个 XML 文件:

<!------------------------File1--------------------------------->
    <note id="ignoreThisAttribute_1">
      <to>Experts</to>
      <from>Matrix</from>
      <heading id="dontIgnoreThisAttribute_1">Reminder</heading>
      <body>Help me with this problem</body>
    </note>
<!------------------------File2--------------------------------->
    <note id="ignoreThisAttribute_2">
      <to>Experts</to>
      <from>Matrix</from>
      <heading id="dontIgnoreThisAttribute_2">Reminder</heading>
      <body>Help me with this problem</body>
    </note>

在比较这两个文件时,我必须忽略 Node:note 的属性:id

我正在使用DiffBuilder

Diff documentDiff = DiffBuilder.compare(srcFile).withTest(destFile).build()

大多数在线解决方案建议实施DifferenceEvaluator

也试过了,但这会忽略所有具有属性 id 的节点,而我想忽略来自特定节点的属性:

public class IgnoreAttributeDifferenceEvaluator implements DifferenceEvaluator {
        private String attributeName;
        public IgnoreAttributeDifferenceEvaluator(String attributeName) {
            this.attributeName = attributeName;
        }

        @Override
        public ComparisonResult evaluate(Comparison comparison, ComparisonResult outcome) {
            if (outcome == ComparisonResult.EQUAL)
                return outcome;
            final Node controlNode = comparison.getControlDetails().getTarget();


            System.out.println(controlNode.getNodeName());
            if (controlNode instanceof Attr) {
                Attr attr = (Attr) controlNode;
                if (attr.getName().equals(attributeName)) {
                    return ComparisonResult.EQUAL;
                }
            }
            return outcome;
        }
    }

在我的测试类中调用方法:

final Diff documentDiff = DiffBuilder.compare(src).withTest(dest)
.withDifferenceEvaluator(new IgnoreAttributeDifferenceEvaluator("id"))
.build();

有人可以建议我使用 XMLUnit 2.x 实现这一目标的方法吗 XMLUnit 的新手,因此请提供相应的帮助。

提前致谢。

【问题讨论】:

    标签: java xml xml-parsing xmlunit xmlunit-2


    【解决方案1】:

    如果你真的想的话,你可以使用DifferenceEvaluator。除了属性本身的名称之外,您所要做的就是测试Attr 的“所有者元素”的名称。

    但 XMLUnit 2.x 对此提供了不同的解决方案:AttributeFilter。该代码与您已经拥有的 DifferenceEvaluator 没有太大区别,但您不会混淆问题。

    class IgnoreNoteId implements Predicate<Attr> {
    
        public boolean test(Attr attr) {
            return !("note".equals(attr.getOwnerElement().getNodeName())
                && "id".equals(attr.getNodeName()));
        }
    }
    

    使用 Java8 时,withAttributeFilter 中的 lambda 甚至更短。

    【讨论】:

    • 非常感谢斯特凡。这很有帮助。我使用了“withAttributeFilter”。我想我需要更新我的 Lamba (Java 8) 概念。
    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多