Laden...

2 Xml Dateien vergleichen und Unterschiede speichern

Erstellt von inflames2k vor 3 Jahren Letzter Beitrag vor 3 Jahren 387 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 3 Jahren
2 Xml Dateien vergleichen und Unterschiede speichern

Verwendetes Datenbanksystem: XML

Für ein aktuelles Projekt muss ich ein Xml-File mit seinem Vorgänger vergleichen und alle Änderungen zusammenfassen.
Dabei sollen teilweise Xml-Knoten beim Vergleich ausgeschlossen werden.

Im Ergebnis sollen anschließend n-Xml Dateien raus kommen, die jeweils den geänderten Knoten und den alten sowie neuen Wert und alle ignorierten Werte enthält.

Beispiel:

Vorher:


<Data>
    <Buffer>10</Buffer>
    <Status>1</Status>
    <ReadTime>dd.MM.yyyy HH:mm:ss</ReadTime>
</Data>

Nachher:


<Data>
    <Buffer>20</Buffer>
    <Status>1</Status>
    <ReadTime>dd.MM.yyyy HH:mm:ss</ReadTime>
</Data>

Im Ergebnis soll jetzt folgendes ausgegeben werden:


<Diff>
    <NodeName>Buffer</NodeName>
    <PreviousValue>10</PreviousValue>
    <CurrentValue>20</CurrentValue>
    <Data>
           <Buffer>20</Buffer>
           <ReadTime>dd.MM.yyyy HH:mm:ss</ReadTime>
    </Data>
</Diff>

Bei dem flachen Xml kein Problem. Das wird straight forward runterprogrammiert und die Xml Knotenweise durchgegangen. Die Knoten aus der alten Xml werden dann mithilfe des NodeNamen aus der neuen gelesen.

Allerdings habe ich einen Knoten im Kopf, wie ich das bei Xml-Dateien bewerkstellige, die eben nicht flach alle Informationen auf einer Ebene haben. Hat hier jemand eine Idee bzw. einen Vorschlag?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

2.078 Beiträge seit 2012
vor 3 Jahren

Mit XPath würde ich die einzelnen Knoten identifizieren, das kann man sich auch relativ leicht selber aus einem XmlNode zusammen bauen.
Du gehst also Knoten für Knoten das eine XML durch, baust daraufhin den XPath zusammen und suchst damit den passenden Knoten im anderen XML.

Dabei solltest Du aber Auflistungen im Hinterkopf behalten und wie Du das jeweils dazu passende Gegenstück findest - dazu müsste es ja geeignete Werte geben, wenn es nicht der Index ist.
Hier könnte man eine Wert Index-XPath bestimmen, den baust Du dann als Bedingung im ersten XPath ein.

W
955 Beiträge seit 2010
vor 3 Jahren

Allerdings habe ich einen Knoten im Kopf, ... Das ist bei Rekursion häufig der Fall.

656 Beiträge seit 2008
vor 3 Jahren

Microsoft hat vor ewigen Zeiten mal das Projekt XMLDiffPatch in die Welt raus geworfen, was einerseits ein Diffing-Algorithmus für XML und andererseits ein Viewer (für WinForms glaub ich?) war. Auf die schnelle hab ich nur das NuGet Package gefunden, aber der Source Code sowie ein Haufen Forks sind auch out there, nur als food for thought.

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 3 Jahren

Hallo BhaaL,

das hatte ich auch schon gefunden. Allerdings ist das Diif Ergebnis dort jetzt nicht wirklich brauchbar bzw. sehr komplex.
Bei Unterschieden in den Werten gibt er nur die Indizes der Knoten aus, die sich geändert haben und den neuen Wert.

Habe nun basierend auf Palladin007's Vorschlag eine aktuell gut funktionierende Lösung gefunden.

Ich danke an der Stelle schon einmal.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |