这是我的代码
Scanner s = new Scanner(new File("ignore.txt"));
final ArrayList<String> list = new ArrayList<String>();
while (s.hasNext()){
list.add(s.next());
}
s.close();
int lengthList = list.size();
final Set<String> values = new HashSet<String>(list);
Diff myDiff1 = DiffBuilder.compare(writer1.toString()).withTest(writer.toString())
.checkForSimilar()
.checkForIdentical()
.ignoreWhitespace()
.normalizeWhitespace()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
.withNodeFilter(new Predicate<Node>() {
public boolean test(Node n) {
String temp = Nodes.getQName(n).getLocalPart();
//System.out.println(temp);
return !(n instanceof Element &&
values.contains(temp));
}
})
.withAttributeFilter(new Predicate<Attr>(){
public boolean test(Attr n){
javax.xml.namespace.QName attrName = Nodes.getQName(n);
//System.out.println(attrName.toString());
//QName Temp = new QName();
//System.out.println(Temp.toString()+n.toString());
Boolean temp1 = !values.contains(attrName.toString());
//Boolean temp1 =!attrName.toString().equals("answerType") ;
//System.out.println(temp1);
//return !attrName.equals(new QName("balType",null, null, "curCode"));
return temp1;
}
})
.build();
我的xml文件是
<ns3:CoreExceptionFault xmlns:ns3="http://core.soayodlee.com">
<faultText>com.yodlee.util.system.ycache.CobrandNotSupportedException: The CobrandCache for the cobrand 10004 is not initialized.</faultText>
</ns3:CoreExceptionFault>
我想忽略xmlns:ns3属性。上面的文件Ignore.txt包含我需要忽略的所有节点和属性。但是当我添加xmlns:ns3时,它不会忽略该属性。我正在使用XMLunit 2.2.1
答案 0 :(得分:1)
xmlns:
属性不是“普通”属性,您不能忽略它们,XMLUnit也不会报告它们之间的差异。它们是应用于元素(及其子元素)的元属性,通常由XML解析器从XMLUnit中隐藏。
在您的情况下,您似乎将XML文档与使用不同命名空间URI的元素进行比较。请注意,任何名称空间感知的XML解析器都会有两个不同的文档。
如果你真的想让它们相似,你将不得不使用忽略元素DifferenceEvaluator
的命名空间部分的QName
。
像
这样的东西.withDifferenceEvaluator(DifferenceEvaluators.chain(
DifferenceEvaluators.Default, new MyEvaluator())
类似
class MyEvaluator implements DifferenceEvaluator {
@Override
public ComparisonResult evaluate(Comparison comparison, ComparisonResult outcome) {
if (comparison.getType() == ComparisonType.NAMESPACE_URI) {
return ComparisonResult.SIMILAR;
}
return outcome;
}
}
应该有用。
顺便说一句,你应该只指定checkForSimilar()
和checkForIdentical()
中的一个,它们相互矛盾,只有最后一个获胜。