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
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? –