I am comparing two xml and I have to print the difference. How can I achieve this using LINQ. I know I can use XML diff patch by Microsoft but I prefer to use LINQ . If you have any other idea I will implement that
//First Xml
<Books>
<book>
<id="20504" image="C01" name="C# in Depth">
</book>
<book>
<id="20505" image="C02" name="ASP.NET">
</book>
<book>
<id="20506" image="C03" name="LINQ in Action ">
</book>
<book>
<id="20507" image="C04" name="Architecting Applications">
</book>
</Books>
//Second Xml
<Books>
<book>
<id="20504" image="C011" name="C# in Depth">
</book>
<book>
<id="20505" image="C02" name="ASP.NET 2.0">
</book>
<book>
<id="20506" image="C03" name="LINQ in Action ">
</book>
<book>
<id="20508" image="C04" name="Architecting Applications">
</book>
</Books>
I want to compare this two xml and print result like this.
Issued Issue Type IssueInFirst IssueInSecond
1 image is different C01 C011
2 name is different ASP.NET ASP.NET 2.0
3 id is different 20507 20508
Here is the solution:
//sanitised xmls:
string s1 = @"<Books>
<book id='20504' image='C01' name='C# in Depth'/>
<book id='20505' image='C02' name='ASP.NET'/>
<book id='20506' image='C03' name='LINQ in Action '/>
<book id='20507' image='C04' name='Architecting Applications'/>
</Books>";
string s2 = @"<Books>
<book id='20504' image='C011' name='C# in Depth'/>
<book id='20505' image='C02' name='ASP.NET 2.0'/>
<book id='20506' image='C03' name='LINQ in Action '/>
<book id='20508' image='C04' name='Architecting Applications'/>
</Books>";
XDocument xml1 = XDocument.Parse(s1);
XDocument xml2 = XDocument.Parse(s2);
//get cartesian product (i think)
var result1 = from xmlBooks1 in xml1.Descendants("book")
from xmlBooks2 in xml2.Descendants("book")
select new {
book1 = new {
id=xmlBooks1.Attribute("id").Value,
image=xmlBooks1.Attribute("image").Value,
name=xmlBooks1.Attribute("name").Value
},
book2 = new {
id=xmlBooks2.Attribute("id").Value,
image=xmlBooks2.Attribute("image").Value,
name=xmlBooks2.Attribute("name").Value
}
};
//get every record that has at least one attribute the same, but not all
var result2 = from i in result1
where (i.book1.id == i.book2.id
|| i.book1.image == i.book2.image
|| i.book1.name == i.book2.name) &&
!(i.book1.id == i.book2.id
&& i.book1.image == i.book2.image
&& i.book1.name == i.book2.name)
select i;
foreach (var aa in result2)
{
//you do the output :D
}
Both linq statements probably could be merged, but I leave that as an exercise for you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With