2016-10-24 2 views
0

Ich versuche, 2 XML-Dateien, die ähnlich sind (zum Testen habe ich nur die Reihenfolge der Elemente mit einem Randomize-Tool geändert) mit XMLUnit zu vergleichen.Einschränkungen der XML-Einheit

Gibt es Einschränkungen hinsichtlich der maximalen Anzahl von Elementen oder der maximalen Komplexität von Elementen und untergeordneten Elementen?

Solange meine XML-Datei nicht zu lang ist und die Elemente ziemlich einfach sind, funktioniert alles gut.

Aber sobald es zu komplexe Elemente (bis zu fünf Unterelemente) gibt, gibt Ähnliches false zurück und ich bekomme Diffs, die nicht existieren.

Mein erster Eindruck ist, dass das gleiche Ergebnis passiert, wenn ich zu viele einfache Elemente bekomme. Aber das ist jetzt noch nicht sicher.

Kennt jemand etwas über Standardeinschränkungen der XML-Einheit und gibt es eine Möglichkeit, sie für meine Erfahrungen anzupassen?

Vielleicht sollte ich erwähnen, dass ich bestimmte Elemente innerhalb der komplexen Elemente ignorieren muss. Ich bin mir nicht sicher, ob das wichtig ist. Es ist nicht in den weniger komplexen Elementen.

package newXMLComperator; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import org.custommonkey.xmlunit.DetailedDiff; 
import org.custommonkey.xmlunit.Diff; 
import org.custommonkey.xmlunit.Difference; 
import org.custommonkey.xmlunit.XMLUnit; 
import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier; 



public class Arbeiter { 

private File quelle, vergleich; 

public Arbeiter(File quelle, File vergleich) { 
    this.quelle=quelle; 
    this.vergleich=vergleich; 
} 

public void vergleichen() 
{ 
    long tbevore = System.currentTimeMillis(); 
    XMLUnit.setIgnoreAttributeOrder(Boolean.TRUE); 
    XMLUnit.setIgnoreWhitespace(Boolean.TRUE); 
    String f1 = lesen(quelle); 
    String f2 = lesen(vergleich); 

    try { 
     Diff diff = new Diff(f1, f2); 
     diff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier()); 
     diff.overrideDifferenceListener(new IgnoreNamedElementsDifferenceListener(findSVSW_ID(quelle))); 
     DetailedDiff dd = new DetailedDiff(diff); 
     boolean result = dd.similar(); 

     StringBuilder sb = new StringBuilder(); 
     if (result ==true) 
     { 
      sb.append("Die Dateien sind inhaltsgleich"); 
     } 
     else 
     { 
      sb.append("Die Dateien unterscheiden sich \n \n"); 
      List<Difference>list = dd.getAllDifferences(); 
      for (Difference aktuell : list) 
      { 
       if (!aktuell.isRecoverable()) 
       { 
        sb.append("Der Ausdruck "+aktuell.getControlNodeDetail().getValue()+" wurde gesucht \n"); 
        sb.append("Der Ausdruck "+aktuell.getTestNodeDetail().getValue()+" wurde gefunden \n"); 
        sb.append("Xpath: "+aktuell.getTestNodeDetail().getXpathLocation()+"\n \n"); 

       } 
      } 
     } 
     long tafter = System.currentTimeMillis(); 
     String dauer = Long.toString((tafter-tbevore)/1000); 
     sb.append("Die Bearbeitung dauerte " +dauer+" Sekunden \n"); 
     speichern(sb.toString()); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 




} 

private String lesen(File datei) 
{ 
    String result =""; 
    try { 
     BufferedReader leser = new BufferedReader(new FileReader(datei)); 
     StringBuilder sb = new StringBuilder(); 
     String gelesen = leser.readLine(); 
     while (gelesen!=null) 
     { 
      sb.append(gelesen); 
      gelesen=leser.readLine(); 
     } 
     result=sb.toString(); 
     leser.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return result; 
} 

private List<String> findSVSW_ID(File datei) 
{ 
    List<String>liste = new ArrayList<String>(); 
    liste.add("AUFTRAGSCHLUESSEL"); 
    liste.add("LIEFERUNGSCHLUESSEL"); 
    try { 
     BufferedReader leser = new BufferedReader(new FileReader(datei)); 
     String gelesen = leser.readLine(); 
     while (gelesen!=null) 
     { 
      if (gelesen.contains("SVSW_ID")) 
      { 
       String [] teile = gelesen.split(">"); 
       String temp = teile[0].replaceAll("<", ""); 
       if (!liste.contains(temp)) 
       { 
        String t2=temp.replaceAll(" ", ""); 
        liste.add(t2); 
       } 

      } 
      gelesen=leser.readLine(); 
     } 


    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    return liste; 
} 

private void speichern(String text) 
{ 
    File datei = new File(quelle.getParent()+"/ausgabe.txt"); 
    try { 
     BufferedWriter schreiber = new BufferedWriter(new FileWriter(datei)); 
     schreiber.write(text); 
     schreiber.flush(); 
     schreiber.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

Vielen Dank für Hilfe

+0

Hier ist Post im Zusammenhang mit XMLUnit Einschränkungen [XMLUnit - XML-Datei Vertiefung Auswirkungen auf Vergleich] (http: // Stackoverflow.com/questions/5248517/xmlunit-xml-file-indentation-impacts-on-comparison) und [XMLUnit-Vergleich fehlgeschlagen, da die Reihenfolge der untergeordneten Knoten] (http://stackoverflow.com/questions/28683449/xmlunit-comparison-failure-because -Kind-Knoten-Reihenfolge). Hatten Ihre XML-Einträge diese Funktionen? –

Antwort

0

Die einzige wirkliche Einschränkung ist die Erinnerung. XMLUnit verwendet DOM unter den Abdeckungen und ein großes Dokument kann viel Speicher benötigen. Aber wenn Sie nicht genügend Speicher haben, ist das Ergebnis eine Ausnahme, keine falschen Unterschiede.

Auch abhängig von Ihrem ElementQualifier Vergleich könnte ziemlich langsam als potenziell alle Kind-Elemente eines Test-Node erhalten verglichen mit allen Kind-Elemente eines Kontroll-Knoten. Dies ist viel sensibler für die Anzahl der Kinder eines einzelnen Knotens - vielleicht die Breite des Baumes - als die Anzahl der Ebenen - die Höhe des Baumes.

Es ist schwer zu sagen, welche Art von "nicht existierenden" Unterschieden Sie sehen. Normalerweise passiert es, dass XMLUnit die Elemente nicht vergleicht, von denen Sie denken, dass sie es tun sollten, weil ElementQualifier falsch ist.

Bitte beachten Sie, dass Sie XMLUnit 1.x verwenden, während die aktuelle Version 2.2.1 - 2.x eine andere API hat, aber die obigen Größen-/Geschwindigkeitsbeschränkungen mit 1.x teilt.

0

Danke für die schnelle Unterstützung. Ich werde es noch einmal versuchen.

Nach dem Lesen 3.4.4. von http://xmlunit.sourceforge.net/userguide/html/ar01s03.html Ich denke, dass der RecursiveElementNameAndTextQuuifier der richtige ist, weil die Reihenfolge meiner Kindknoten zwischen Test- und Kontrollknoten unterschiedlich ist.

Ist mein Verständnis richtig, dass nur der RecursiveElementNameAndTextQuuifier meine Anforderungen erfüllen kann, ohne der Anzahl der Ebenen in meinen Kindknoten zu unterliegen?

Die Speicherauslastung scheint in Ordnung zu sein. Bei der Anwendung der .similar() -Methode verwendet die Java-VM rund 3 GB. Das sollte überhaupt kein Problem sein.

Thanks again