繁体   English   中英

使用LINQ查询XML以返回不同的子元素

[英]Query XML with LINQ to return child elements that are different

考虑以下两个XML文档。

原版的

<Stock>
   <Vehicle id="123456">
      <Name>Ford Ka</Name>
      <Images>
         <Image Id="111111" Url="http://somewhere.com/GetImage.aspx?ImageId=111111" LastModified="2016-05-12 13:09:00"/>
         <Image Id="222222" Url="http://somewhere.com/GetImage.aspx?ImageId=222222" LastModified="2016-05-12 13:09:00"/>
      </Images>
   </Vehicle>
</Stock>

<Stock>
   <Vehicle id="123456">
      <Name>Ford Ka</Name>
      <Images>
         <Image Id="111111" Url="http://somewhere.com/GetImage.aspx?ImageId=111111" LastModified="2016-05-12 13:09:00"/>
         <Image Id="222222" Url="http://somewhere.com/GetImage.aspx?ImageId=222222" LastModified="2016-05-13 09:00:00"/>
         <Image Id="333333" Url="http://somewhere.com/GetImage.aspx?ImageId=333333" LastModified="2016-05-12 13:09:00"/>
      </Images>
   </Vehicle>
</Stock>

所以它们之间的区别是...

  1. 新的XML Image Id="222222"更改了LastModified值。
  2. 新的XML包含一个新的<Image> ,其id="333333"

我如何使用LINQ返回一个XDocument ,其中包含<Vehicle id>和每个<Image> ,其中新XML中的<Image id>值不在原始XML中(差异2)或<Image id> IS原始XML但<Image>属性值是否与同一Image的原始XML中的值不同(差异1)?

产生的XDocument应该看起来像这样...

<Stock>
   <Vehicle id="123456">
      <Images>
         <Image Id="222222" Url="http://somewhere.com/GetImage.aspx?ImageId=222222" LastModified="2016-05-13 09:00:00"/>
         <Image Id="333333" Url="http://somewhere.com/GetImage.aspx?ImageId=333333" LastModified="2016-05-12 13:09:00"/>
      </Images>
   </Vehicle>
</Stock>

1]通过id属性加入新旧车辆

2]查找新的或修改的Image ,通过它们的字符串表示形式对其进行比较

3]选择Image进入新的Vehicle元素

4]从Vehicle元素中生成结果Stock

var diff = from newVehicle in newXml.Descendants("Vehicle")
           join oldVehicle in oldXml.Descendants("Vehicle")
           on     newVehicle.Attribute("id").Value 
           equals oldVehicle.Attribute("id").Value 

           select new XElement("Vehicle", newVehicle.Attribute("id"),
                                new XElement("Images",
                                         newVehicle.Descendants("Image")
                                                   .Where(i=>!oldVehicle.Descendants("Image")
                                                                       .Any(iold=>iold.ToString() == i.ToString())
                                                          )
                                             )
                               );

var stock = new XElement("Stock", diff);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM