小编典典

使用XMLUnit 2.X比较xml文件时,忽略特定节点的特定属性

java

我有两个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>

在比较这两个文件时,我不得不忽略idNode 的属性:note

我正在使用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;
        }
    }

我的Test类中的调用方法:

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

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

提前致谢。


阅读 428

收藏
2020-11-26

共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()));
    }
}

甚至在withAttributeFilter使用Java8时用lambda 缩短。

2020-11-26