2016-12-20 2 views
0

J'essaie de comparer PUT Request XML et GET Response XML. Le code suivant fonctionne si bien, mais selon les exigences, certains éléments ne sont lisibles et apparaissent donc dans le fichier XML de réponse GET. Comment puis-je éliminer un tel résultat?Comment puis-je ignorer un élément de noeud inexistant dans le résultat de la comparaison XML?

Résultat:

[different] Expected presence of child node 'null' but was 'bs:key_id' - comparing at null to <bs:key_id...> at /container[1]/int_user_object[1]/attributes[1]/key_id[1] 

Ce que j'ai essayé:

import java.io.IOException; 
import java.util.List; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.custommonkey.xmlunit.DetailedDiff; 
import org.custommonkey.xmlunit.Diff; 
import org.custommonkey.xmlunit.XMLUnit; 
import org.xml.sax.SAXException; 
    public class XMLComparator { 

     static Logger logger = LogManager.getLogger(XMLComparator.class); 

     public boolean compare(String xml1, String xml2) throws SAXException, IOException { 

      XMLUnit.setIgnoreWhitespace(true); 
      XMLUnit.setIgnoreComments(true); 
      XMLUnit.setIgnoreAttributeOrder(true); 

      DetailedDiff diff = new DetailedDiff(new Diff(xml1, xml2)); // wrap the Diff inside Detailed Diff. 
      List<?> allDiff = diff.getAllDifferences(); 
      boolean result = diff.similar(); 
      if (result == false) { 

       logger.info("There are " + allDiff.size() + " differences. XML difference(s): " + diff.toString()); 

      } else { 
       logger.info("Sending XML and received XML are same: " + result); 
      } 
      return result; 

     } 

    } 

je comptais ajouter une telle logique dans mon code après avoir lu ce document doc mais je ne pouvais pas.

if(NODE_TYPE_ID == null){ 
difference.ignore();} 

Selon l'aide Stefan vous pouvez voir la dernière version de mon code

EDIT

public class XMLComparator { 

    static Logger logger = LogManager.getLogger(XMLComparator.class); 

    public boolean compare(String xml1, String xml2) throws SAXException, IOException { 

     XMLUnit.setIgnoreWhitespace(true); 
     XMLUnit.setIgnoreComments(true); 
     XMLUnit.setIgnoreAttributeOrder(true); 

     DetailedDiff diff = new DetailedDiff(new Diff(xml1, xml2)); 
     diff.overrideDifferenceListener(new DifferenceListener() { 
      @Override 
      /* CHILD_NODE_NOT_FOUND_ID is used: A child node in one piece of XML could not be match against any other node of the other piece. 
      * 
      */ 
      public int differenceFound(Difference difference) { 
       return difference.getId() == DifferenceConstants.CHILD_NODE_NOT_FOUND_ID 
         ? RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL : RETURN_ACCEPT_DIFFERENCE; 
      } 


      @Override 
      public void skippedComparison(Node arg0, Node arg1) { 

      } 
     }); 
     List<?> allDiff = diff.getAllDifferences(); 
     boolean result = diff.identical(); 
     if (result == false) { 

      logger.info("There are " + allDiff.size() + " differences. XML difference(s): " + diff.toString()); 

     } else { 
      logger.info("Sending XML and received XML are same: " + result); 
     } 
     return result; 

    } 

} 

Répondre

1

Une approche consiste à mettre en œuvre un DifferenceListener et supprimer les différences qui résultent de nœuds manquants, quelque chose comme

public int differenceFound(Difference difference) { 
    return difference.getId() == DifferenceConstants.CHILD_NODELIST_SEQUENCE_ID 
     ? RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL 
     : RETURN_ACCEPT_DIFFERENCE; 
} 

Si vous avez le choix de swi Cependant, en utilisant XMLUnit 2.x, vous pouvez utiliser un NodeFilter pour masquer complètement les éléments manquants (plutôt que d'ignorer tous les éléments manquants).

+0

Que vous mais j'ai encore vu tout le résultat inclus [différent] Présence attendue du noeud enfant 'null' mais était 'bs: key_id' - comparaison à null à at/container [1]/int_user_object [1]/attributes [1]/key_id [1] – limonik

+0

J'ai utilisé CHILD_NODE_NOT_FOUND_ID au lieu de CHILD_NODELIST_SEQUENCE_ID. Puisque mon problème ne concerne pas la commande. J'ai réussi à éliminer certains d'entre eux mais je ne pouvais toujours pas satisfaire mes résultats. – limonik

+0

Une question: Je dois utiliser NAMESPACE_PREFIX_ID c'est une constante de niveau document. D'autre part, CHILD_NODE_NOT_FOUND_ID est au niveau de l'élément. Puis-je avoir une chance d'utiliser le bot d'entre eux. Si oui comment? Par programme, j'ai essayé && mais cela n'a pas fonctionné. – limonik