2011-01-11 6 views
0

Ich bin auf der Suche nach einer Möglichkeit zum Vergleich mit XML-Dateien (Beispiele unten) und erstellen Sie eine Liste mit dem Xpath zu den Unterschieden in den beiden Dateien, so dass ich dann überprüfen kann, was sich geändert hat.Vergleichen Sie 2 XML-Dateien mit nur C#

kann dies in Linq getan werden oder muss ich MS Diff Patch verwenden, würde ich wirklich alles in C# ohne zusätzliche Dlls tun wollen.

Oder sollte ich einfach eine XML-Datei durchschleifen und vergleichen, aber wenn ich dies tue, kann ich neue oder gelöschte Knoten verpassen!

Datei A

<info> 
    <Retrieve> 
    <LastNameInfo> 
     <LNameNum>1</LNameNum> 
     <NumPeople>1</NumPeople> 
     <NameType/> 
     <LName>TEST</LName> 
    </LastNameInfo> 
    <Segment> 
     <SegNum>1</SegNum> 
     <Comment>A test</Comment> 
    </Segment> 
    <Segment> 
     <SegNum>2</SegNum> 
     <Dt>20110910</Dt> 
     <Comment>B test</Comment> 
    </Segment> 
    </Retrieve> 
</info> 

Datei B:

<info> 
    <Retrieve> 
    <LastNameInfo> 
     <LNameNum>1</LNameNum> 
     <NameType/> 
     <LName>TESTING</LName> 
    </LastNameInfo> 
    <Segment> 
     <SegNum>1</SegNum> 
     <Status>HS</Status> 
     <Comment>A test</Comment> 
    </Segment> 
    <Segment> 
     <SegNum>2</SegNum> 
     <Dt>20110910</Dt> 
     <Comment>COULD I USE LINQ</Comment> 
    </Segment> 
    </Retrieve> 
</info> 

Output XPath Liste

/info/Retrieve/LastNameInfo/NumPeople 
/info/Retrieve/LastNameInfo/LName 
/info/Retrieve/Segment[1]/Status 
/info/Retrieve/Segment[2]/Comment 
+1

Bitte geben Sie die gewünschte Ausgabe für die obigen Beispieldateien. –

+0

Sind wir, dass die XML-Struktur zu übernehmen MATC müssen h zwischen den beiden Dateien? – Jacob

+0

Das Q mit der Xpath-Liste, die ich suche, wurde als Ausgabe aktualisiert. Ich würde dann in Code jeden Xpath in für jedes Dokument untersuchen und entscheiden, welche zu halten oder das Ergebnis zusammenzuführen ... – Adrian

Antwort

1

Ich nehme an, Sie die Äquivalenz des XML vergleichen wollen (die Infoset) und nicht nur die lexikalische Äquivalenz der Dateien. XML kann in seiner lexikalischen Form erheblich variieren (Auswahl der Zitate, insignifikante Leerzeichen, Reihenfolge der Attribute). All dies kann variiert werden, ohne das Infoset zu beeinflussen.

Ich würde die Dateien XML Canonicalization algorithm gives two difference results when called directly than when called as part of an xml digital signature? kanonisieren und auf lexikalische Identität prüfen. Wenn sie nicht gleichwertig sind, kann es ziemlich schwierig sein zu bestimmen, wo sie sich unterscheiden (triviale Unterschiede sind relativ einfach, aber wenn die Elementreihenfolge usw. wichtig ist, kann es keinen objektiven Unterschied geben.)

Ich habe dies für meine eigene App getan (in Java, tut mir leid) und es war nicht trivial - und wieder nahm ich eine ziemlich enge Äquivalenz zwischen den Dateien an.Ich ließ es auch für reelle Zahlen arbeiten, die innerhalb von Epsilon übereinstimmen mussten, wo die lexikalische Äquivalenz nicht gut genug ist.

sehen Xml Comparison in C# für einige xmldiff Tools

+0

Ich würde intrigiert werden, wenn Sie sogar ein externes Werkzeug kennen so etwas tun? – Reddog

+0

Hier ist MS XMLDiff und Patch http://msdn.microsoft.com/en-us/library/aa302294.aspx - diese Seite zeigt die verschiedenen Dinge, die berücksichtigt werden müssen –

+0

Hallo ja, es ist das Infoset, das ich vergleichen möchte Die Dateien werden immer unterschiedlich sein, da sie Zeitstempel usw. enthalten, aber die Knoteninhalte, die ich vergleichen möchte. – Adrian