比较两个xml和打印使用LINQ的区别 [英] Compare two xml and print the difference using LINQ

查看:119
本文介绍了比较两个xml和打印使用LINQ的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我比较两个XML,我必须打印的区别。我怎样才能做到这一点使用LINQ。
我知道我可以使用Microsoft XML打上补丁,但我更喜欢使用LINQ。如果您有任何其他的想法,我会实施



//第一个XML

 <图书> 
<书>
< ID =20504形象=C01NAME =C#中的深度>
< /书>
<书>
< ID =20505形象=C02NAME =ASP.NET>
< /书>
<书>
< ID =20506形象=C03NAME =LINQ在行动>
< /书>
<书>
< ID =20507形象=C04NAME =设计应用程序>
< /书>
< /图书>



//第二个XML

 <图书> 
<书>
< ID =20504形象=C011NAME =C#中的深度>
< /书>
<书>
< ID =20505形象=C02NAME =ASP.NET 2.0>
< /书>
<书>
< ID =20506形象=C03NAME =LINQ在行动>
< /书>
<书>
< ID =20508形象=C04NAME =设计应用程序>
< /书>
< /图书>



我想比较这两个XML和打印结果是这样的。

 发行问题类型IssueInFirst IssueInSecond 

1的图像不同的C01 C011
2名不同ASP.NET ASP.NET 2.0
3 ID不同20507 20508


解决方案

下面是解决方案:

  //消毒XML的:
串S1 = @<图书>
<书的id =20504形象='C01'的名字='C#中的深度/>
<书的id =20505形象='C02'的名字='ASP.NET'/>
<书的id =20506形象='C03'的名字='LINQ在行动/>
<书的id =20507形象='C04'的名字='设计应用程序 />
< /图书>中;
字符串s2 = @<图书>
<书的id =20504形象='C011'的名字='C#中的深度/>
<书ID =' 20505形象='C02'的名字='ASP.NET 2.0/>
<书的id =20506形象='C03'的名字='LINQ在行动/>
< ;书籍ID =20508形象='C04'的名字='设计应用程序/>
< /图书>中;

的XDocument XML1 = XDocument.Parse(S1);
的XDocument XML2 = XDocument.Parse(S2)​​;

//获取笛卡尔乘积(我认为)
VAR RESULT1 =从xmlBooks1在xml1.Descendants(书),从xmlBooks2在xml2.Descendants
(书)
选择新{
BOOK1 =新的{
ID = xmlBooks1.Attribute(ID)。价值
图像= xmlBooks1.Attribute(图像)。价值
产品名称= xmlBooks1.Attribute(名称)。价值
},
BOOK2 =新的{
ID = xmlBooks2.Attribute(ID)。价值
。图像= xmlBooks2.Attribute(图像)的价值,
NAME = xmlBooks2.Attribute(name)的值
}
}。

//让每一个记录至少有一个属性是相同的,但不是所有的
VAR结果2 =从我RESULT1中的
,其中(i.book1.id ==我.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。命名== i.book2.name)
选择我;



的foreach(在RESULT2变种AA)
{
//你的输出:D
}

这两个LINQ语句也许可以合并,但我离开,作为一个练习。


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.

这篇关于比较两个xml和打印使用LINQ的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆