2009-08-06 16 views
27

Ich habe eine XML-Nachricht wie folgt:Wie ignoriere ich bestimmte Elemente beim XML-Vergleich?

<root> 
    <elementA>something</elementA> 
    <elementB>something else</elementB> 
    <elementC>yet another thing</elementC> 
</root> 

ich eine Nachricht dieser Art durch ein Verfahren unter Test mit einer erwarteten Nachricht erzeugt vergleichen will, aber ich weiß nicht über elementA kümmern. So würde ich die obige Meldung gerne gleich betrachtet werden:

<root> 
    <elementA>something different</elementA> 
    <elementB>something else</elementB> 
    <elementC>yet another thing</elementC> 
</root> 

ich die neueste Version von XMLUnit verwenden.

Ich stelle mir vor, dass die Antwort das Erstellen einer benutzerdefinierten DifferenceListener; Ich will das Rad einfach nicht neu erfinden, wenn da draußen etwas bereit ist.

Vorschläge, die eine andere Bibliothek als XMLUnit verwenden, sind willkommen.

Antwort

10

Die Dinge änderten sich für XMLUnit viel haben, da diese Frage beantwortet wurde.

Sie können nun einfach einen Knoten ignorieren, wenn eine DiffBuilder mit:

final Diff documentDiff = DiffBuilder 
      .compare(expectedSource) 
      .withTest(actualSource) 
      .withNodeFilter(node -> !node.getNodeName().equals(someName)) 
      .build(); 

Wenn Sie dann documentDiff.hasDifferences() Knoten rufen hinzugefügt werden ignoriert zu filtern.

38

ich eine DifferenceListener Umsetzung in Liquidation, die eine Liste von Knotennamen nimmt (mit Namespaces) textliche Unterschiede zu ignorieren:

public class IgnoreNamedElementsDifferenceListener implements DifferenceListener { 
    private Set<String> blackList = new HashSet<String>(); 

    public IgnoreNamedElementsDifferenceListener(String ... elementNames) { 
     for (String name : elementNames) { 
      blackList.add(name); 
     } 
    } 

    public int differenceFound(Difference difference) { 
     if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) { 
      if (blackList.contains(difference.getControlNodeDetail().getNode().getParentNode().getNodeName())) { 
       return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; 
      } 
     } 

     return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; 
    } 

    public void skippedComparison(Node node, Node node1) { 

    } 
} 
+13

Ich bin überrascht, dass es dieser Komplex ist - enttäuschend, wenn xmlunit nicht etwas eingebaut hat, um bestimmte Elemente zu ignorieren? – bacar

+0

Diese Lösung ist jetzt ziemlich alt. Anscheinend verwendet das neue xmlunit-Programmiermodell [ComparisonListener] (http://www.xmlunit.org/api/java/2.4.0/org/xmlunit/diff/ComparisonListener.html), nicht DifferenceListener. – Cheeso

-1

Öffentliche Klasse IgnoreNamedElementsDifferenceListener implementiert DifferenceListener { private set blackList = new HashSet();

public IgnoreNamedElementsDifferenceListener(String ... elementNames) { 
    for (String name : elementNames) { 
     blackList.add(name); 
    } 
} 

public int differenceFound(Difference difference) { 
    if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) { 
     if (blackList.contains(difference.getControlNodeDetail().getNode().getParentNode().getNodeName())) { 
      return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; 
     } 
    } 

    return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; 
} 

public void skippedComparison(Node node, Node node1) { 

} 

}

Wie diese eigene Implementierung meiner Methode aufzurufen, die Unterschiede nach dem spezifischen Knoten für den Vergleich ignoriert zu sehen.?

+0

Scheint so, als ob du eine neue Frage als Antwort stellst. Wenn Sie eine neue Frage haben, stellen Sie sie als Frage und nicht als Antwort auf eine bestehende Frage. – Cheeso

Verwandte Themen