C# XML Strukturen vergleichen und Differenzen anzeigen

domidragon

Fleet Admiral
Registriert
Juli 2008
Beiträge
11.532
Huhu

Ich steh vor einem Problem, dass ich nicht zu bewältigen weiss.

Ich soll zwei XML Strukturen miteinander vergleichen und die Differenzen anzeigen.

Dabei handelt es sich um XmlNode als Typ.


Die Strukturen umfassen ca. 15000 Einträge. Die Namen der Knoten sind entweder gleich oder nicht vorhanden. Die Namen werden also nicht verändert, wenn dann nur gelöscht oder einen hinzugefügt.
Es kann aber vorkommen, dass es ein Knoten-Name mehrmals in der ganzen Baumstruktur gibt.
Nur die Values können sich ändern.

Es soll angezeigt werden, ob der wert verändert wurde oder nicht vorhanden ist, bzw. einer hinzugefügt worden ist. Bei den Knoten soll nur angzeigt werden ob sie vorhanden sind oder gelöscht wurden, bzw. hinzugefügt worden sind.

In der Logik so im Kopf ist es kein Problem, ich arbeite aber zum ersten mal mit XML und hab da noch keinen grossen Überblick. Was mich aber verhindert mom. ist die "logik im code". Ich weiss nicht wie ich das erklären soll.

Ich hab mal angefangen mit iterieren.

Also Name von Struktur 1 in Struktur 2 suchen. Wenn er den namen findet, soll er weiter zu den Childnodes und da wieder das selbe spiel, zudem überprüfen, ob ein Value vorhanden ist.
Es passiert aber schnell, dass Struktur 2 ganz wo anders ist als Struktur 1 etc. Ich hab glaube ich zu viel Foreach drin ;)

Ich hab ein riessen durcheinander und hoffe ihr könnt mir helfen. Ein kleines Beispielprojekt wäre super, denn ich verliere mich immer wieder im Code :(

Danke


greez

EDIT:
Das XMLDiff von Microsoft habe ich schon versucht, das geht aber nicht, da dies noch .net framework 1.1 benutzt und ich mit win7 nicht so weit runter kann -.-
 
es muss in ein Programm integriert werden, dass die config des ausgelesenen Devices so überprüfen soll...
 
wie tief verschachtelt sind die einträge?
Kannst du einen Auszug daraus geben wie die XML Struktur aussieht?
 
Es geht bis 6 "tiefen". ist zumindest das maximale, was ich bis jetzt gesehen habe in dem file ;)

Es gibt einfach das Root "Configuration"
Darin befinden sich childnodes. die muss von der anzahl her aber nicht gleich sein. die namen die verwendet werden bleiben aber gleich. sind auch nur 3-6 oder so je nach dem.
eines dieser knoten nennt sich settings und dieses hat abstufungen ohne ende. da ist praktisch keine struktur mehr vorhanden und variert auch von konfiguration zu konfiguration.
das problem ist, es gibt dadrin unterknoten die werden von set0 auf setx gezählt in einigen knoten. zumindest diese set's gibt es mehr als einmal, was ziemlich mühsam ist.
oder subadress(a-d) gibt es auch mehrmals, die auch noch in den sets sind...

Edit: .... (die langen files gelöscht...)


meine lösungsidee am anfang war, dass ich den path des einzelnen knoten dann bei jedem knoten and die 2. struktur gebe um dort zu gucken, ob dieser dort vorhanden ist. hab aber nicht rausgefunden wie und ob das überhaupt geht... -.-

Danköö^^

greez
 
Zuletzt bearbeitet:
Also deine Xml ist schonmal extrem kacke aufgebaut.
Sowas wie

SubAdressA
SubAdressB
SubAdressc

ist super Kacke. Besser wäre wenn der Knoten "SubAdress" heißt mit einem Attribute "Id" oder sowas. So lässt sich das jetzt nämlich viel blöder abfragen. Eventuell hättest du da mit Linq-to-Xml was machen können, aber bei der struktur seh ich schwarz für linq to xml
 
Das ding kommt leider nicht von mir. Kann ich nicht ändern.

Weiss keiner eine Lösung?
 
Was du machen könntest, wäre zuersteinmal die XML-Dateien alphabetisch zu ordnen. so würdest du auch am schnellsten sehen, wenn abweichungen auftreten.
PseudoCode:
1. Sortiere Oberste ebene Alphabetisch (z.B. mittels compare methode)
2. Gehe durch jedes Element und schaue ob Kind-Elemente vorhanden sind.
3. Wenn ja, sortiere diese und mache mit Schritt 2 für das jeweilige Kindelement weiter
4. Wenn nein vergleiche die beiden dateien.

Besteht die Möglichkeit, dass du die XML Struktur verändern darfst? Sodass du eine sauberer Struktur einführen kannst?
 
nein leider nicht. die wird so überall eingesetzt. kann ich nicht verändern.
 
Dann kannst du dir entweder mal den Link von Madman1209 anschaun oder meine Methode probieren (ohne Gewähr^^)
 
Jap XMLDiff habe ich bereits mal eingebunden, das dumme ist nur, es ist Framework 1.1 und ich hab auf win7 mind. 2. Kann es somit nicht gebrauchen. es kommt dann immer eine exception deswegen...

Sortieren kriege ich ned hin :( kann nur nach gross oder kleinbuchstaben, die XPathExpression hat ned mehr optionen ? -.-
ich geh ja auch durch jedes element. aber wieso nur vergleichen, wenn es kein kindelement hat? das macht irgendwie wenig sinn oder sehe ich es nicht?
er soll ja alles vergleichen, somit auch die "parent" elemente. also die aktuellen, ob ein Kind da ist oder nicht. (wie das klingt^^)

greez
 
Zuletzt bearbeitet:
Vergleichen sollte man auch, wenn es kein Kind-Element hat...nur es macht wenig Sinn ein Element zu vergleichen welches kein KindElement hat.

Zum Sortieren:
Du könntest ableiten und eine compareTo-Methode einführen, welche dir anhand des Namens sortiert.
Dann pakst du einfach jede zusammenhängende Ebene des XML-Dokuments in eine Liste und rufst die Sort()-Methode auf. (Damit sortiert werden kann, braucht es die compareTo-Methode).

Als letztes musst du nur noch einen Algorithmus schreiben, der dir die beiden sortierten Elemente vergleicht.
 
So hab einen anderen Lösungsweg gefunden.

Ich lese erst alle leaf-Nodes raus, bzw diese, die ein attribute haben.
so itteriere ich durch die struktur 1 und vergleiche jeden leaf-knoten anhand des pfades(hab kurz eine Methode dazu gemacht, die jeweils die parentnodes hochgeht um so einen pfad zu generieren) mit der Struktur 2.
ist dieser vorhanden, soll er die attribute vergleichen und bei übereinstimmung den knoten in den kopien der strukturen löschen.
ist dieser nicht in Struktur 2 vorhanden, soll er leere einträge machen. da habe ich nun das problem, dass man nicht einfach so leere XmlNodes hinzufügen kann. hat da einer ne idee? anderer lösungsansatz vlt.?

am ende soll man im treeview nur noch sehen, welche werte, knoten anders sind. alle die, die gleich waren wurden ja gelöscht. und da wo etwas fehlte soll ein "dummy" element rein mit "dummy" attributen, also leeren, damit man sieht, das diese gefehlt haben.

diese leeren objekte einzufügen bekomme ich nicht hin. XmlNode kann man nicht einfach so erstellen. nur mit create, dazu muss man aber alles wissen, wie die struktur aufgebaut ist etc. was ja varieren kann.

weiss einer weiter?

greez
 

Ähnliche Themen

Zurück
Oben