2017-02-02 88 views
0

這是我的代碼忽略XML ns參數使用XML單元

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

名稱空間聲明不是普通屬性,XMLUnit可能甚至不會看到它(作爲一個屬性,只有它的作用)。你想要比較它的元素是什麼樣的?我不知道我是否理解你的意思,忽略它。 –

+0

我使用屬性過濾器和節點過濾器來忽略我不想斷言的屬性和節點。所以,我想在比較xml的時候忽略這個「xmlns:ns3 =」http://core.soayodlee.com「>」。使用上面的代碼它不起作用,請幫助我 –

+0

命名空間聲明不是普通的屬性,你不能對它們使用'AttributeFilter'。你的其他XML是什麼樣的。 CoreExceptionFault是否與你的代碼片段一樣在命名空間內(URI方式),還是一個沒有任何命名空間的XML? –

回答

1

xmlns:屬性不是「正常」屬性,您不能忽略它們,XMLUnit也不會報告它們之間的差異。它們是適用於元素(及其子元素)的元屬性,並且通常由XML解析器隱藏於XMLUnit中。

就你而言,你似乎在比較XML文檔和使用不同名稱空間URI的元素。要警告的是,對於任何支持名稱空間的XML解析器,兩個這樣的文檔將會不同。

如果您確實想讓它們通過類似的方式,您必須使用忽略元素QName的命名空間部分的DifferenceEvaluator

喜歡的東西

.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()之一,他們相互矛盾,只有最後一個勝利。