我有两个相同类型的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>
答案 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)
如果您将两个初始文档命名为xd0
和xd1
,那么这对我有用:
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>