2009-08-06 5 views
27

que tienen un mensaje XML de este modo:¿Cómo ignoro ciertos elementos cuando comparo XML?

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

quiero comparar un mensaje de este tipo producido por un método bajo prueba a un mensaje de espera, pero no se preocupan por elementA. Por lo tanto, me gustaría que el mensaje anterior sea considerada igual a:

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

estoy usando la versión más reciente de XMLUnit.

Estoy imaginando que la respuesta implica la creación de un DifferenceListener personalizado; Simplemente no quiero reinventar la rueda si hay algo listo para usar.

Sugerencias que utilizan una biblioteca que no sea XMLUnit son bienvenidas.

Respuesta

10

Las cosas han cambiado mucho desde que se para XMLUnit respondió a esta pregunta.

Ahora puede fácilmente pasar por alto un nodo cuando se utiliza un DiffBuilder:

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

Si a continuación, llama a documentDiff.hasDifferences() nodos añade filtrar será ignorado.

38

terminé la implementación de un DifferenceListener que toma una lista de nombres de nodos (con espacios de nombres) a ignorar las diferencias textuales para:

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

Me sorprende que sea este complejo, ¿decepcionante si xmlunit no tiene algo incorporado para ignorar elementos específicos? – bacar

+0

Esta solución es bastante antigua ahora. Aparentemente, el nuevo modelo de programación xmlunit usa [ComparisonListener] (http://www.xmlunit.org/api/java/2.4.0/org/xmlunit/diff/ComparisonListener.html), no DifferenceListener. – Cheeso

-1

public class IgnoreNamedElementsDifferenceListener implementa 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) { 

} 

}

cómo invocar esta propia aplicación a mi método para ver las diferencias después del nodo específico ignorado para la comparación.?

+0

Parece que está haciendo una nueva pregunta como respuesta. Si tiene una pregunta nueva, hágala como pregunta, no como respuesta a una pregunta existente. – Cheeso

Cuestiones relacionadas