2009-08-06 9 views
27

Ho un messaggio XML in questo modo:Come ignoro determinati elementi quando si confronta XML?

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

voglio mettere a confronto un messaggio di questo tipo prodotto da un metodo in prova a un messaggio atteso, ma non si preoccupano elementA. Così, mi piacerebbe il messaggio di cui sopra per essere considerato pari a:

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

sto utilizzando l'ultima versione di XMLUnit.

Sto immaginando che la risposta implichi la creazione di una DifferenceListener personalizzata; Non voglio reinventare la ruota se c'è qualcosa di pronto da usare là fuori.

I suggerimenti che utilizzano una libreria diversa da XMLUnit sono i benvenuti.

risposta

10

Le cose sono cambiate molto per XMLUnit poiché questa domanda è stato risposto.

Si può ora facilmente ignorare un nodo di quando si utilizza un DiffBuilder:

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

Se poi si chiama documentDiff.hasDifferences() nodi aggiunti per filtrare saranno ignorati.

38

Finii per l'attuazione di un DifferenceListener che prende una lista di nomi dei nodi (con spazi dei nomi) per ignorare le differenze testuali per:

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

Sono sorpreso che sia così complesso - deludente se xmlunit non ha qualcosa di costruito per ignorare elementi specifici? – bacar

+0

Questa soluzione è piuttosto vecchia ora. Apparentemente il nuovo modello di programmazione xmlunit utilizza [ComparisonListener] (http://www.xmlunit.org/api/java/2.4.0/org/xmlunit/diff/ComparisonListener.html), non DifferenceListener. – Cheeso

-1

classe pubblica IgnoreNamedElementsDifferenceListener implements 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) { 

} 

}

Come richiamare questa propria implementazione al mio metodo per vedere le differenze dopo il nodo specifico ignorato per il confronto.?

+0

Sembra che tu stia facendo una nuova domanda come risposta. Se hai una nuova domanda, ponila come una domanda, non come risposta a una domanda esistente. – Cheeso

Problemi correlati