使用IEnumerable.Except()比较两个XML文件

时间:2012-05-25 15:46:48

标签: c# xml compare ienumerable linq-to-xml

使用以下代码:

    XDocument aDoc = XDocument.Load(fileA);
    XDocument bDoc = XDocument.Load(fileB);

    var commonfromA = aDoc.Descendants("Project").Except(bDoc.Descendants("Project")); 

我比较了以下XML:

aDoc.xml

<Employees>
      <Project ID="1" Name="Project1"/>
      <Project ID="2" Name="Project2"/>
</Employees>

bDoc.xml

<Employees>
  <Project ID="1" Name="Project1"/>
  <Project ID="3" Name="Project3"/>
</Employees> 

当我执行代码时,我获得了

<Project ID="1" Name="Project1"/>
<Project ID="2" Name="Project2"/>

而不是

<Project ID="2" Name="Project2"/> **Which is the elements that are in A but not in B**

提前谢谢。

1 个答案:

答案 0 :(得分:1)

是的,那是因为aDoc 中的所有元素都不是实际上在bDoc中。如果你向父母询问这些元素,他们会报告不同的结果。

如果您对获取ID很满意,那很容易:

var idsJustInA = aDoc.Descendants("Project")
                     .Select(x => (int) x.Attribute("ID"))
                     .Except(bDoc.Descendants("Project"))
                                 .Select(x => (int) x.Attribute("ID")));

如果你想要元素本身,你可以 传递IEqualityComparer<XElement>来按ID比较元素,或者你可以使用来自ExceptByMoreLINQ之类的内容:

var justInA = aDoc.Descendants("Project")
                  .ExceptBy(bDoc.Descendants("Project"),
                            x => (int) x.Attribute("ID"));