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