tags:

views:

89

answers:

3

What is the best way in C# to get a collection of objects representing the changes between two XML texts, e.g.:

First:

<Customer>
  <Id>1</Id>
  <FirstName>Angie</FirstName>
  <LastName>Jones</LastName>
  <ZipCode>23434</ZipCode>
  <Contracts>
    <Contract>
        <Id>234</Id>
        <Title>Test Contract 1</Title>
    </Contract>
  </Contracts>
</Customer>

Second:

<Customer>
  <Id>1</Id>
  <FirstName>Angie</FirstName>
  <MiddleName>S.</MiddleName>
  <LastName>Jones-Smith</LastName>
  <Contracts>
    <Contract>
        <Id>234</Id>
        <Title>Test Contract 1</Title>
    </Contract>
    <Contract>
        <Id>534</Id>
        <Title>Test Contract 2</Title>
    </Contract>
  </Contracts>
</Customer>

Changes:

Kind:       Node:                  Before     After
--------    ----------             --------   ----------------
Change      Customer/LastName      Jones      Jones-Smith
Addition    Customer/MiddleName               S.
Deletion    Customer/ZipCode
Addition    Customer/Contracts[1]             <Contract>
                                                <Id>534</Id>
                                                <Title>Test Contract 2</Title>
                                              </Contract>

The point is to then pass the changes as a collection of objects onto a GUI which can appropriately display them.

What is the best way to go about this, i.e. structure the class(es) that represents the changes and traverse/examine the XML in order to identify the changes most accurately?

A: 

For this kind of work I have used XMLDiff patch provided by MSFT. It produces a diffgram which you can then represent as a class if you want.

Stan R.
+1  A: 

This appears to be a duplicate question for: http://stackoverflow.com/questions/794331/xml-comparison-in-c

Have a look there, see if it helps.

Quote:

I've got an answer by Martin Honnen in XML and the .NET Framework MSDN Forum. In short he suggests to use XQuery 1.0's deep-equal function and supplies some C# implementations. Seems to work.

Codesleuth
A: 

LINQ to XML has a DeepEquals method that I believe you can utilize in this case.

Then perhaps you can use the XSLT/XQuery processor called SAXON to get the differences.

Josh Stodola
XNode.DeepEquals seems to return a boolean telling me if the two XML texts are equal or not. Is there something similar that gives me a collection of the differences? Something like like "DeepCompare"?
Edward Tanguay
@Edward Answer updated to include a reference to SAXON
Josh Stodola