2011-07-05 22 views
6

Estoy intentando con éxito XmlUnit, y es muy útil en mi trabajo. Ahora, tengo un pequeño problema, que no sé cómo resolver. Tengo una clase Java, que tiene un conjunto, y al transformarlo en XML, los elementos en el interior pueden tener cualquier orden.Comparación de archivos xml similares con XmlUnit con etiquetas desordenadas (mismo nombre de etiqueta con diferentes atributos)

Cuando trato de estos dos archivos en XMLUnit funciona (Dif dice que son similares):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
    </AvailableMeasures> 
</Monitor> 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
     <MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA> 
    </AvailableMeasures> 
</Monitor> 

Pero cuando las etiquetas tienen el mismo nombre (con diferentes atributos) no lo hace funciona (que mezcla los atributos, y esperan que la una en la otra etiqueta):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
     <MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor> 
    </AvailableMeasures> 
</Monitor> 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
    </AvailableMeasures> 
</Monitor> 

¿hay alguna solución?

+0

he encontrado la solución por mí mismo, con esta pieza de código: \t \t Dif diff = new Dif (controlXml, responseXML); \t \t diff.overrideElementQualifier (new ElementNameAndAttributeQualifier()); está hecho;) – greuze

+0

¿puede por favor enviar una respuesta a la pregunta usted mismo y luego aceptar esa respuesta? Además, debe aceptar respuestas a preguntas anteriores si resuelven su problema. – Zecas

+0

Ok, pensé que no podría responder mi propia pregunta. Me responderé a mí mismo ahora. – greuze

Respuesta

6

Encontré la solución por mi cuenta.

Diff diff = new Diff(controlXml, responseXml); 
diff.overrideElementQualifier(new ElementNameAndAttributeQualifier()); 
+0

¿Cómo se haría esto en XmlUnit 2.0? – lanoxx

0

encima solución sólo funciona con el orden atributos pero no va a funcionar si usted tiene problemas con el mismo orden de tipo de elemento, como a continuación:

<CustomerDataSet> 
     <CustomerData> 
      <Key>ACCOUNT_TYPE</Key> 
      <Value>GREEN</Value> 
     </CustomerData> 
     <CustomerData name = "bla"> 
      <Key>EMAIL_ADDRESS</Key> 
      <Value>[email protected]</Value> 
     </CustomerData> 
     <CustomerData> 
      <Key>DATE_OF_BRITH</Key> 
      <Value>01-01-1976</Value> 
     </CustomerData> 
    </CustomerDataSet> 

      <CustomerDataSet> 
     <CustomerData name = "bla"> 
      <Key>EMAIL_ADDRESS</Key> 
      <Value>[email protected]</Value> 
     </CustomerData> 
     <CustomerData> 
      <Key>ACCOUNT_TYPE</Key> 
      <Value>GREEN</Value> 
     </CustomerData> 
     <CustomerData> 
      <Key>DATE_OF_BRITH</Key> 
      <Value>01-01-1976</Value> 
     </CustomerData> 
    </CustomerDataSet> 

Sin embargo, puede evitar esto usando RecursiveElementNameAndTextQualifier vez .

3

Esto parece funcionar para XMLUnit 2,0:

Diff myDiff = DiffBuilder.compare(Input.fromString(expected)) 
      .withTest(Input.fromString(actual)) 
      .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndAllAttributes)) 
      .checkForSimilar() 
      .build(); 
Cuestiones relacionadas