使用 XMLUnit 2.X 比较 xml 文件时忽略特定节点的特定属性
Ignoring a particular attribute of a specific Node while comparing xml files using XMLUnit 2.X
我有两个 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;
}
}
我测试中的调用方法class:
final Diff documentDiff = DiffBuilder.compare(src).withTest(dest)
.withDifferenceEvaluator(new IgnoreAttributeDifferenceEvaluator("id"))
.build();
有人可以建议我使用 XMLUnit 2.x 实现此目的的方法吗
XML单元的新手,请相应地提供帮助。
提前致谢。
如果您确实愿意,可以使用 DifferenceEvaluator
。除了属性本身的名称之外,您所要做的就是测试 Attr
的 "owner element" 的名称。
但是 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 甚至更短
我有两个 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;
}
}
我测试中的调用方法class:
final Diff documentDiff = DiffBuilder.compare(src).withTest(dest)
.withDifferenceEvaluator(new IgnoreAttributeDifferenceEvaluator("id"))
.build();
有人可以建议我使用 XMLUnit 2.x 实现此目的的方法吗 XML单元的新手,请相应地提供帮助。
提前致谢。
如果您确实愿意,可以使用 DifferenceEvaluator
。除了属性本身的名称之外,您所要做的就是测试 Attr
的 "owner element" 的名称。
但是 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 甚至更短