忽略特定节点的特定属性,而使用XMLUnit 2.X
问题描述:
比较XML文件,我有两个XML文件:忽略特定节点的特定属性,而使用XMLUnit 2.X
<!------------------------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>
我不得不忽视的属性:节点的id
: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;
}
}
在我的测试类调用方法:
final Diff documentDiff = DiffBuilder.compare(src).withTest(dest)
.withDifferenceEvaluator(new IgnoreAttributeDifferenceEvaluator("id"))
.build();
有人可以建议我一种方式,我可以使用XMLUnit 2.x来实现这一点 XMLUnit的新手,请相应地提供帮助。
在此先感谢。
答
如果您真的想要,您可以使用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时即使有一个lambda较短在withAttributeFilter
。
非常感谢Stefan。这很有帮助。我使用“withAttributeFilter”。 猜猜我需要更新我的lamba(Java 8)的概念。 –