2017-02-02 4 views
0

это мой кодXML нс атрибут игнорировать используя блок 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

Я использую фильтр атрибута и фильтр узла, чтобы игнорировать атрибуты и узлы, которые я не хочу утверждать. Итак, я хочу игнорировать этот «xmlns: ns3 =» http://core.soayodleee.com «>» при сравнении xml. Используя приведенный выше код, он не работает, пожалуйста, помогите мне –

+0

Объявления пространства имен не являются нормальными атрибутами, вы не можете использовать для них атрибут AttributeFilter. Как выглядит ваш другой XML. Является ли 'CoreExceptionFault' внутри одного пространства имен (URI-мудрый), как в вашем фрагменте, или является одним XML без каких-либо пространств имен? –

ответ

1

Атрибуты xmlns: не являются «нормальными» атрибутами, вы не можете игнорировать их, и XMLUnit также не будет сообщать о различиях в них. Они являются мета-атрибутами, которые применяются к элементу (и его дочерним элементам) и обычно скрываются от XMLUnit парсером XML.

В вашем случае вы, кажется, сравниваете документы XML с элементами, использующими разные URI пространства имен. Будьте предупреждены, что два таких документа будут отличаться для любого XML-парсера, осведомленного о пространстве имен.

Если вы действительно хотите, чтобы они проходили как аналогичные, вам необходимо использовать DifferenceEvaluator, который игнорирует часть пространства имен элемента QName s.

Что-то вроде

.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(), они противоречат друг другу, и выигрывает только последний.

Смежные вопросы