XML-Vergleicher gesucht

lui7172

Mitglied
Hallo liebe Gemeinde,

es sollen zwei XML-Dateien miteinander verglichen werden. Dabei sollen verschiedene Arten von Unterschieden verschieden gewichtet werden. Blanks, Newlines z.B. interessieren nur, wenn sie auch in einem Textnode stehen. Manche Werte (IDs) dürfen durchaus unterschiedlich sein usw. usf. D.h., ich suche einen Vergleicher (am besten im source), der Filter (z.B. per xpath und regex) erlaubt und den ich in mein Programm einbauen bzw. von dort aus ansteuern kann. Ich brauche keine Ansicht oder GUI jedweder Art. Hat oder kennt da Jemand was? Ich würde mich über Tipps und Hinweise sehr freuen.

Danke
lui
 
Zuletzt bearbeitet:
Hallo,

mit den in eclipse integrierten diff Tools klappt das vergleichen von XML Dokumenten IMHO auch ganz gut.

außerdem gibts für Eclipse u.a. noch Oxygen:
http://www.oxygenxml.com/xml_diff_and_merge.html

mit XMLSpy geht das ganz gut:
http://www.altova.com/xmlspy/compare-xml.html

Noch nie Benutzt, klingt aber interessant:
http://www.altova.com/downloadtrialdiffdog.html?gclid=CJj6jYa6mKACFYWT3wodKGrCdw

Edit: ich glaub eine Filter-Funktion wie du sie haben möchtest bieten die aber nicht .

Gruß Tom
 
Hi Thomas,

da habe ich mich wohl unklar ausgedrückt, sorry. Ich suche kein Tool/Programm, sondern eine Komponente/Library/Stück Source o.ä. Ich brauche das Ganze für einen programmatischen Vergleich von zwei XMLs. Es geht darum, dass eine gewisse Menge und eine gewisse Art von Abweichungen erlaubt sind. Bei Abweichungen außerhalb dieser Grenzen gibt's Alarm :-)

Beispiel:
Code:
<Parent ID="623678" VName="Willi" NName="Wuehlkelle">
   <Child ID="823" Attr1="xyz" Attr2="uwx" Value="hgasdh ahdhas"/>
   <Child ID="832" Attr1="xyz" Attr2="uwx" Value="hasdjhaskjda"/>
</Parent>

Die IDs dürfen sich ändern, die Values auch. Der Rest nicht. Auch die Struktur nicht. Wobei z.B. ein zusätzlicher Child nur als eine Änderung gelten soll und nicht auch alle folgenden Elemente. Nicht erlaubte Änderungen sollen protokolliert werden.

Falls es nix "fertiges" gibt, so würde ich mich auch über Ansätze, Ideen usw. freuen :-)

Danke
lui
 
Ich hab in einem ähnlichen Zusammenhang mal was von XMLUnit gehört...

Ansonsten, wenn du selbst was schreiben willst - welchen Umfang können deine Datein so haben?
 
Zuletzt bearbeitet:
Ich hab in einem ähnlichen Zusammenhang mal was von XMLUnit gehört...

Ansonsten, wenn du selbst was schreiben willst - welchen Umfang können deine Datein so haben?

Schwer zu sagen; bis ca. 5 MB. Aber ich würde schon einen Ansatz wählen, der dann auch noch bei 6 MB funktioniert :-) Ehrlich gesagt verstehe ich die Frage nicht?

Ich habe mal ganz kurz (gerade keine Zeit) einen Blick auf XMLUnit geworfen; scheint auf jeden Fall in die richtige Richtung zu gehen. Danke Dir erst mal ganz herzlich.

Gruß
lui
 
Wenn ich das richtig verstehe, möchte man 2 XMLs auf mannigfaltige Art vergleichen...
Notfalls würde ich sowas mit z.B. SAX selbst schreiben. Klingt zwar erstmal vielleicht viel, aber sollte doch möglich sein, oder?
 
Sicherlich wäre das möglich, ich könnte mir etwas in der Art vorstellen:

Java:
//[...]

SAXBuilder builder = new SAXBuilder();
Document doc1 = builder.build(new File(path1));
Document doc2 = builder.build(new File(path2));
root1 = doc1.getRootElement();
root2 = doc2.getRootElement();
boolean gleich = vergleicheKnoten(root1, root2);
//"gleich" auswerten

//[...]

//Methode um Attributwerte zu bekommen: getAttribute(String attrName)

//rekursiver Aufruf notwendig
public boolean vergleicheKnoten(Element node1, Element node2){
	//Fall 1: Beide Knoten haben Kinder.
	if(node1.hasChildNodes()&&node2.hasChildNodes()){
		//Fall 1.1: Die Knoten haben die gleiche Anzahl Kinder.
		if(node1.getChildren().size()==node2.getChildren().size()) {
			// [...]
		}
		//Fall 1.2: Die Knoten haben eine unterschiedliche Anzahl Kinder.
		else {
			// [...]
		}
	}
	//Fall 2: Beide Knoten haben keine Kinder.
	else if(!node1.hasChildNodes()&&!node2.hasChildNodes()){
		// [...]
	}
	//Fall 3: Ein Knoten hat Kinder, der andere nicht.
	else {
		// [...]
	}
}

Du müsstest je nachdem, was bei dir gleich und unterschiedlich sein kann nur den Rest dazuprogrammieren.
 
Zuletzt bearbeitet:
Wenn ich das richtig verstehe, möchte man 2 XMLs auf mannigfaltige Art vergleichen...
Notfalls würde ich sowas mit z.B. SAX selbst schreiben. Klingt zwar erstmal vielleicht viel, aber sollte doch möglich sein, oder?

Natürlich ist das möglich - aber wohl nicht in der Zeit, die ich dafür aufbringen darf/will. Und immer das Rad neu erfinden ist irgendwie auch nicht effektiv.
Im Moment verschiebt sich die Sache etwas, aber ich glaube, dass XMLUnit ein sehr guter Ansatz ist.
 
Sicherlich wäre das möglich, ich könnte mir etwas in der Art vorstellen:
....

Du müsstest je nachdem, was bei dir gleich und unterschiedlich sein kann nur den Rest dazuprogrammieren.

Das (Haupt)Problem sind Verschiebungen durch Einfügungen/Löschungen. Es sollen ja nicht alle Folgeelemente als unterschiedlich angesehen werden. Dann noch eine schöne API für die Vergleicher usw. usf. Selber machen ist wirklich nur der letzte Ausweg.
 
Zurück