Tutorial :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.:


<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>  


<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>  


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?


This appears to be a duplicate question for: Xml Comparison in C#

Have a look there, see if it helps.


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.


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.


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.

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »