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

时间:2016-05-12 13:51:33

标签: c# xml linq

考虑以下两个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"
  3. 如何使用LINQ返回包含XDocument的{​​{1}}和<Vehicle id>,其中新XML中的<Image>值不在原始XML中(差异2)或原始XML中的<Image id> IS但是<Image id>属性值中的任何一个与同一图像的原始XML中的值不同(差异1)?

    结果<Image>应该看起来像这样......

    XDocument

1 个答案:

答案 0 :(得分:1)

1]按id属性

加入新旧车辆

2]找到新的或修改过的Image,用字符串表示法比较它们

3]选择Image成新的Vehicle元素

4]从Stock元素构建了Vehicle个结果

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