在 C# 中合并相同类型的 xml 节点

本文关键字:xml 节点 同类型 合并 | 更新日期: 2023-09-27 18:33:44

我有 2 个相同类型的 XML 元素(来自具有相同架构的不同 XML 文档),如下所示:

<Parent>
  <ChildType1>contentA</ChildType1>
  <ChildType2>contentB</ChildType2>
  <ChildType3>contentC</ChildType3>
</Parent>
<Parent>
  <ChildType1>contentD</ChildType1>
  <ChildType3>contentE</ChildType3>
</Parent>

元素类型 ChildType1、ChildType2 和 ChildType3 在父元素中最多可以有一个实例。

我需要做的是将第二个父节点的内容与第一个父节点合并到一个新节点中

,如下所示:
<Parent>
  <ChildType1>contentD</ChildType1>
  <ChildType2>contentB</ChildType2>
  <ChildType3>contentE</ChildType3>
</Parent>

在 C# 中合并相同类型的 xml 节点

使用 Linq to XML 来分析源文档。然后在它们之间创建一个联合,并按元素名称分组,并根据您想要的内容使用组中的第一个/最后一个元素创建一个新文档。

像这样:

var doc = XElement.Parse(@"
    <Parent>
        <ChildType1>contentA</ChildType1>
        <ChildType2>contentB</ChildType2>
        <ChildType3>contentC</ChildType3>
    </Parent>
");
 var doc2 = XElement.Parse(@"
    <Parent>
        <ChildType1>contentD</ChildType1>
        <ChildType3>contentE</ChildType3>
    </Parent>
");
var result = 
    from e in doc.Elements().Union(doc2.Elements())
    group e by e.Name into g
    select g.Last();
var merged = new XDocument(
    new XElement("root", result)
);

merged现在包含

<root>
    <ChildType1>contentD</ChildType1>
    <ChildType2>contentB</ChildType2>
    <ChildType3>contentE</ChildType3>
</root>

如果您将两个初始文档命名为 xd0xd1,那么这对我有用:

var nodes =
    from xe0 in xd0.Root.Elements()
    join xe1 in xd1.Root.Elements() on xe0.Name equals xe1.Name
    select new { xe0, xe1, };
foreach (var node in nodes)
{
    node.xe0.Value = node.xe1.Value;
}

我得到了这个结果:

<Parent>
  <ChildType1>contentD</ChildType1>
  <ChildType2>contentB</ChildType2>
  <ChildType3>contentE</ChildType3>
</Parent>