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;
}
}
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
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
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