C# 使用Linq检查XML文件是否丢失或多余记录

C# 使用Linq检查XML文件是否丢失或多余记录,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有两个XML文件(我称它们为A和B),其中包含重复的记录,但其中一个文件可能有额外的记录,或者可能有更少的记录。我需要编写一些Linq代码来比较两个文件,告诉我文件“A”是否有不在文件“B”中的记录。我还需要做相反的操作,选择文件“B”中但不在文件“A”中的记录。每个文件中的XML看起来类似于以下内容: <importJob> <entities> <entity id="7eaab021-1c05-4385-b820-50aa619c9a99" &g

我有两个XML文件(我称它们为A和B),其中包含重复的记录,但其中一个文件可能有额外的记录,或者可能有更少的记录。我需要编写一些Linq代码来比较两个文件,告诉我文件“A”是否有不在文件“B”中的记录。我还需要做相反的操作,选择文件“B”中但不在文件“A”中的记录。每个文件中的XML看起来类似于以下内容:

<importJob>
  <entities>
    <entity id="7eaab021-1c05-4385-b820-50aa619c9a99" >
      <field name="RuleTypeId" value="a29b9bce-d1f5-4c11-879f-f1a572b6ff0a" />
      <field name="Name" value="Group1" />
      <field name="Notes" />
      <field name="EntityId" value="14B03381-C09C-4B69-A749-F33A4B3F0305" />
      <field name="Selector" />
    </entity>
    <entity id="69cd0eab-d10d-46fb-b1a3-018fd9d6aa97" >
      <field name="RuleTypeId" value="a29b9bce-d1f5-4c11-879f-f1a572b6ff0a" />
      <field name="Name" value="Group2" />
      <field name="Notes" />
      <field name="EntityId" value="1eaab021-1c05-4385-b820-50aa619c9a99" />
      <field name="Selector" />
    </entity>
  </entities> 
</importJob>

假设两个文件都是xDoc:

var aIds = fileA.Descendants("entity").Select(x=> x.Attribute("id").Value()).ToList();
var bIds = fileb.Descendants("entity").Select(x=> x.Attribute("id").Value()).ToList();
var noMatches = aIds.Select(x=> !bIds.Contains(x).Tolist();
noMatches.AddRange(bIds.Select(x=> !aIds.Contains(x).Tolist());

这将获得不匹配的id列表,稍加修改即可获得所需的内容(例如,选择一个新对象,该对象是文件名和id的NV对)。

首先-从两个文件中选择实体id。投影查询时,可以将id属性强制转换为
Guid
。这将返回GUID集合:

var idsA = xdocA.Descendants("entity").Select(e => (Guid)e.Attribute("id"));
var idsB = xdocB.Descendants("entity").Select(e => (Guid)e.Attribute("id"));
然后使用和查找序列中的公共ID和仅存在于第二个序列中的ID:

IEnumerable<Guid> inBothFiles = idsA.Intersect(idsB);
IEnumerable<Guid> onlyInFileB = idsB.Except(idsA);
IEnumerable Inbouthfiles=idsA.Intersect(idsB);
IEnumerable only yinfileb=idsB.Except(idsA);

谢谢,它可以满足我的需要。
var idsA = xdocA.Descendants("entity").Select(e => (Guid)e.Attribute("id"));
var idsB = xdocB.Descendants("entity").Select(e => (Guid)e.Attribute("id"));
IEnumerable<Guid> inBothFiles = idsA.Intersect(idsB);
IEnumerable<Guid> onlyInFileB = idsB.Except(idsA);