Question

I have 2 XML elements(from different XML documents with the same schema) of the same type looking like this:

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

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

Element types ChildType1, ChildType2 and ChildType3 can have at most one instance in the Parent element.

What I need to do is merge the content of the second Parent node with the first Parent node into a new node that would look like this:

<Parent>
  <ChildType1>contentD</ChildType1>
  <ChildType2>contentB</ChildType2>
  <ChildType3>contentE</ChildType3>
</Parent>
Was it helpful?

Solution

Use Linq to XML to parse the source documents. Then create a union between them and group by element name and create a new document using the first/last elements in the groups depending on what you want.

Something like this:

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 now contains

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

OTHER TIPS

If you name the two initial documents as xd0 and xd1 then this worked for me:

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;
}

I got this result:

<Parent>
  <ChildType1>contentD</ChildType1>
  <ChildType2>contentB</ChildType2>
  <ChildType3>contentE</ChildType3>
</Parent>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top