我有两个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。
id
note
我正在使用DiffBuilder:
DiffBuilder
Diff documentDiff = DiffBuilder.compare(srcFile).withTest(destFile).build()
大多数在线解决方案建议实施DifferenceEvaluator:
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的新方法来实现此目标,请相应地提供帮助。
提前致谢。
DifferenceEvaluator如果您确实愿意,可以使用一个。您只需要做的就是测试Attr除属性本身名称之外的“所有者元素”名称。
Attr
但是XMLUnit 2.x为此提供了另一种解决方案:AttributeFilter。该代码与DifferenceEvaluator您已经拥有的代码没有什么不同,但是您不会混淆任何事情。
AttributeFilter
class IgnoreNoteId implements Predicate<Attr> { public boolean test(Attr attr) { return !("note".equals(attr.getOwnerElement().getNodeName()) && "id".equals(attr.getNodeName())); } }
甚至在withAttributeFilter使用Java8时用lambda 缩短。
withAttributeFilter