2009-08-06 10 views
27

mam komunikat XML tak:Jak ignorować określone elementy podczas porównywania kodu XML?

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

chcę porównać wiadomość tego typu produkowanego metodą badanego do oczekiwanej wiadomości, ale nie dbam o elementA. Tak, chciałbym się powyższy komunikat, aby uznać równa:

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

Używam najnowszej wersji XMLUnit.

Wyobrażam sobie, że odpowiedź wymaga stworzenia niestandardowego DifferenceListener; Po prostu nie chcę odkrywać koła, jeśli jest coś gotowego do użycia.

Sugestie korzystające z biblioteki innej niż XMLUnit są mile widziane.

Odpowiedz

10

Co zmieniło się wiele na XMLUnit ponieważ kwestia ta została wysłuchana.

Teraz można łatwo zignorować węzeł przy użyciu DiffBuilder:

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

Jeśli następnie zadzwonić documentDiff.hasDifferences() węzły dodany do filtrowania zostaną zignorowane.

38

I skończyłem wdrożenie DifferenceListener, która pobiera listę nazw węzłów (z przestrzeni nazw), aby ignorować różnice tekstowe dla:

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

Jestem zaskoczony, że to ten kompleks - rozczarowujący, jeśli xmlunit nie ma czegoś wbudowanego do ignorowania określonych elementów? – bacar

+0

To rozwiązanie jest dość stare. Najwyraźniej nowy model programowania xmlunit używa [ComparisonListener] (http://www.xmlunit.org/api/java/2.4.0/org/xmlunit/diff/ComparisonListener.html), a nie DifferenceListener. – Cheeso

-1

public class IgnoreNamedElementsDifferenceListener implementuje różnicęListener { 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) { 

} 

}

Jak wywołać tę własną implementację do mojego sposobu, aby zobaczyć różnice po konkretnym węźle ignorowane dla porównania.?

+0

Wygląda na to, że zadajesz nowe pytanie jako odpowiedź. Jeśli masz nowe pytanie, zadaj je jako pytanie, a nie jako odpowiedź na istniejące pytanie. – Cheeso