在 C# 中将 2 Xml 个文件与 XDocument 相交

Intersect 2 Xml Files with XDocument in C#

我有 2 个 XML 文件,我想获取两个文件中的所有 XNode,仅基于它们相同的属性“id”。 这是 XML 文件的样子:

<parameters>
  <item id="57">
    <länge>8</länge>
    <wert>0</wert>
  </item>
  <item id="4">
    <länge>8</länge>
    <wert>0</wert>
  </item>
  <item id="60">
    <länge>8</länge>
    <wert>0</wert>
  </item>
</parameters>

给出第二个 XML 文件,如下所示:

<parameters>
  <item id="57">
    <länge>16</länge>
    <wert>10</wert>
  </item>
  <item id="144">
    <länge>16</länge>
    <wert>10</wert>
  </item>
</parameters>

现在我只想要 ID=57 的 XNode,因为它在两个文件中都可用。所以输出应该是这样的:

<item id="57">
    <länge>8</länge>
    <wert>0</wert>
</item>

我已经像这样交叉了两个文件:

aDoc = XDocument.Load(file);
bDoc = XDocument.Load(tmpFile);

intersectionOfFiles = aDoc.Descendants("item")
                        .Cast<XNode>()
                        .Intersect(bDoc.Descendants("item")
                        .Cast<XNode>(), new XNodeEqualityComparer());

这似乎只有在所有后代节点都相同时才有效。如果某些值不同,它将不起作用。但我需要让它在相同的属性上工作,值或后代并不重要。

我也尝试获取属性并将它们相交,但这也没有用:

intersectionOfFiles = tmpDoc
                        .Descendants(XName.Get("item"))
                        .Attributes()
                        .ToList()
                        .Intersect(fileDoc.Descendants(XName.Get("item")).Attributes()).ToList();

我是不是遗漏了什么或者这是一个完全错误的方法?

提前致谢。

您应该创建自己的 IEqualityComparer 来比较您想要的 XML 属性:

public class EqualityComparerItem : IEqualityComparer<XElement>
{
    public bool Equals(XElement x, XElement y)
    {
        return x.Attribute("id").Value == y.Attribute("id").Value;
    }

    public int GetHashCode(XElement obj)
    {
        return obj.Attribute("id").Value.GetHashCode();
    }
}

然后您将传递给 XML 解析代码:

    var intersectionOfFiles = aDoc.Root
        .Elements("item")
        .Intersect(
            bDoc.Root
            .Elements("item"), new EqualityComparerItem());

我还更改了您的 XML 解析代码的某些部分(XElement 而不是 XNode,因为“item”是 XML 元素而“id”是 XML 属性)。