3

我有 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 元素中最多可以有一个实例。

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

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

2 回答 2

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>
于 2013-10-02T07:47:53.017 回答
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>
于 2013-10-02T07:52:19.267 回答