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

时间:2013-10-02 07:39:30

标签: c# xml linq-to-xml xelement

我有两个相同类型的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元素中最多只能有一个实例。

我需要做的是将第二个Parent节点的内容与第一个Parent节点合并到一个如下所示的新节点中:

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

2 个答案:

答案 0 :(得分:3)

使用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>

答案 1 :(得分:1)

如果您将两个初始文档命名为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>