【问题标题】:xml ns attribute to ignore using xml unit使用 xml 单元忽略 xml ns 属性
【发布时间】:2017-02-02 15:55:30
【问题描述】:

这是我的代码

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

【问题讨论】:

  • 命名空间声明不是普通属性,XMLUnit 可能甚至看不到它(作为一个属性,只有它的效果)。您想要比较它的元素是什么样的?我不确定我是否理解您忽略它的意思。
  • 我使用属性过滤器和节点过滤器来忽略我不想断言的属性和节点。所以,我想在比较 xml 时忽略这个“xmlns:ns3="core.soayodlee.com">”。使用上面的代码它不起作用请帮助我
  • 命名空间声明不是普通属性,您不能在它们上使用AttributeFilter。您的其他 XML 是什么样的。 CoreExceptionFault 是在与您的 sn-p 相同的命名空间(URI 方式)内,还是一个根本没有任何命名空间的 XML?
  • 有没有办法可以忽略命名空间属性,第一行就是这样 ns3:CoreExceptionFault xmlns:ns3="core.soap.yodlee.com"> 我需要比较
  • 您可能根本看不到属性的Difference,但是对于元素,因为它们的命名空间URI 是不同的。您不需要排除该属性,但必须提供一个 DifferenceEvalutor 以消除命名空间差异。

标签: java xmlunit-2


【解决方案1】:

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

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

如果您真的想让它们以相似的方式传递,则必须使用 DifferenceEvaluator 忽略元素 QNames 的命名空间部分。

类似

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2021-12-17
    • 2014-05-21
    相关资源
    最近更新 更多