要使用xml单元忽略的xml ns属性

时间:2017-02-02 15:55:31

标签: java xmlunit-2

这是我的代码

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

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()中的一个,它们相互矛盾,只有最后一个获胜。