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

标签 c# xml linq-to-xml intersect

我有 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 属性)。

关于c# - 在 C# 中将 2 个 Xml 文件与 XDocument 相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64042642/

相关文章:

c# - 将字符串转换为 int(或其他东西),是否有首选方法?

java - 不使用数据库的 Java 动态 XML 分解

java - 坚持使用 JAXB - 解码 XML 异常

c# - Linq to XML 检索基于属性的值

c# - 将 XElement 添加到特定位置的另一个 XElement

c# - 在 c# 5.0 中, "async/await"函数是否总是在运行开始时在主线程上运行

c# - 可以在 ASPX 标记中执行内联代码吗?

c# - 在 Entity Framework 中添加子记录时如何避免创建父记录?

java - 如何找到 arraylist 中一些虚拟元素之间的最后一个元素

c# - 使用 XMLReader 在 c# 中为多个相似节点解析 XML