Edward Tanguay
Edward Tanguay

Reputation: 193362

How to get a collection of objects representing the diff between two XML texts?

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?

Upvotes: 5

Views: 443

Answers (3)

Josh Stodola
Josh Stodola

Reputation: 82513

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.

Upvotes: 0

Codesleuth
Codesleuth

Reputation: 10541

This appears to be a duplicate question for: 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.

Upvotes: 1

Stan R.
Stan R.

Reputation: 16065

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.

Upvotes: 0

Related Questions