0

这是我的代码

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

4

1 回答 1

1

这些xmlns:属性不是“普通”属性,您不能忽略它们,XMLUnit 也不会报告它们的差异。它们是应用于元素(及其子元素)的元属性,通常被 XML 解析器从 XMLUnit 隐藏。

在您的情况下,您似乎正在将 XML 文档与使用不同名称空间 URI 的元素进行比较。请注意,对于任何支持命名空间的 XML 解析器,两个这样的文档都是不同的。

如果您真的想让它们以相似的方式传递,则必须使用DifferenceEvaluator忽略元素 s 的命名空间部分的a 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;
    }
}

应该管用。

顺便说一句,您应该只指定 and 之一checkForSimilar()checkForIdentical()它们相互矛盾,只有最后一个获胜。

于 2017-02-06T15:30:39.107 回答