Xml 查找重复的元素

Xml 查找重复的元素,xml,linq,group-by,duplicates,distinct,Xml,Linq,Group By,Duplicates,Distinct,我有下面的XML <Automobiles> <Cars> <YearofMfr>2010</YearofMfr> <Mileage>12</Mileage> <MeterReading>1500</MeterReading> <Color>Red</Color> <Condition>Excellent</Cond

我有下面的XML

<Automobiles>
  <Cars>
    <YearofMfr>2010</YearofMfr>
    <Mileage>12</Mileage>
    <MeterReading>1500</MeterReading>
    <Color>Red</Color>
    <Condition>Excellent</Condition>
  </Cars>
  <Cars>
    <YearofMfr>2010</YearofMfr>
    <Mileage>12</Mileage>
    <MeterReading>1500</MeterReading>
    <Color>Red</Color>
    <Condition>Excellent</Condition>
  </Cars>
  <Cars>
    <YearofMfr>2008</YearofMfr>
    <Mileage>11</Mileage>
    <MeterReading>20000</MeterReading>
    <Color>Pearl White</Color>
    <Condition>Good</Condition>
  </Cars>
</Automobiles>

2010
12
1500
红色
杰出的
2010
12
1500
红色
杰出的
2008
11
20000
珍珠白
好
我正在寻找一个LINQ查询,它将返回重复的节点。在上面的XML中有两个相似的节点。结果应包括两个重复节点


我还需要一个查询,它将返回所有不重复的节点。请提供帮助。

我建议您创建一个
Car
类,从XML中创建一个
Car
实例列表,并对该列表进行分析。

这将简化事情,因为您可以覆盖
Car
类的
Equals
方法,仅在所有属性都相同的情况下返回true。

我建议,您创建一个
Car
类,从XML创建一个
Car
实例列表,并对该列表进行分析。

这将简化事情,因为您可以覆盖
Car
类的
Equals
方法,仅在所有属性都相同的情况下返回true。

此查询将在XML中生成重复的
Cars
条目列表,您可以从中获取:

XDocument doc = XDocument.Load(@"test.xml");
var duplicates = doc.Descendants("Cars")
                    .GroupBy(c => c.ToString())
                    .Where(g => g.Count() > 1)
                    .Select(g => g.First())
                    .ToList();
在列表中为每个副本包含多个节点是没有意义的,因为它们是重复的。类似地,您可以过滤掉与任何其他Cars节点重复的节点,只需更改where条件:

var uniqueCars = doc.Descendants("Cars")
                    .GroupBy(c => c.ToString())
                    .Where(g => g.Count() == 1)
                    .Select(g => g.First())
                    .ToList();

此查询将生成XML中重复的
Cars
条目列表,您可以从中获取:

XDocument doc = XDocument.Load(@"test.xml");
var duplicates = doc.Descendants("Cars")
                    .GroupBy(c => c.ToString())
                    .Where(g => g.Count() > 1)
                    .Select(g => g.First())
                    .ToList();
在列表中为每个副本包含多个节点是没有意义的,因为它们是重复的。类似地,您可以过滤掉与任何其他Cars节点重复的节点,只需更改where条件:

var uniqueCars = doc.Descendants("Cars")
                    .GroupBy(c => c.ToString())
                    .Where(g => g.Count() == 1)
                    .Select(g => g.First())
                    .ToList();