How to Copy all Child Nodes(innerXML) to another Xelement
-
Thursday, October 11, 2012 12:22 PM
Dear all,
I have XML Like
<Server Name="Server1" ID="601" Size="A" > <ConfiguredNode></ConfiguredNode> <Node Number="1"></Node> <ModelDetails></ModelDetails> <DataSaved>True</DataSaved> <---> .... </--> </Server> <Server Name="Server2" ID="602" Size="A" > </Server> <Server Name="Server3" ID="603" Size="A" > </Server> <Server Name="Server4" ID="604" Size="A" > </Server> <Server Name="Server5" ID="605" Size="A" > </Server>
I have to copy all the Child nodes under first Server to all the bellow servers using XDocument and Xelement.
string innerxml=string.empty;
foreach (var xserver in xServerDoc.Descendants("Server")) { if (xserver.Name.LocalName.Contains("Server1")) { StringBuilder sb = new StringBuilder(); foreach (var node in xserver.Nodes()) { sb.Append(node.ToString()); } innerxml=sb.tostring(); } } foreach (var xserver in xServerDoc.Descendants("Server")) { if (!xserver.Name.LocalName.Contains("Server1")) { xserver.Add(XElement.Parse(innerXml)); } }
here iam getting the exception like "There are multiple root elements".
I am breaking my head from past 4 hours...I am not getting any solution to fix.
Please help me to fix this issue.....
Thanks in Advance
Pavan Kumar B.V
All Replies
-
Thursday, October 11, 2012 1:44 PM
Well if the snippet you posted is the complete input then the error message is correct, that is not an XML document as there is no single root containing all other elements.
In case you input looks like
<?xml version="1.0" encoding="utf-8" ?> <Root> <Server Name="Server1" ID="601" Size="A" > <ConfiguredNode></ConfiguredNode> <Node Number="1"></Node> <ModelDetails></ModelDetails> <DataSaved>True</DataSaved> <!-- .... --> </Server> <Server Name="Server2" ID="602" Size="A" > </Server> <Server Name="Server3" ID="603" Size="A" > </Server> <Server Name="Server4" ID="604" Size="A" > </Server> <Server Name="Server5" ID="605" Size="A" > </Server> </Root>then you can parse and manipuate it as follows:
XDocument doc = XDocument.Load("input.xml"); XElement server1 = doc.Descendants("Server").FirstOrDefault(s => (string)s.Attribute("Name") == "Server1"); if (server1 != null) { List<XNode> childNodes = server1.Nodes().ToList(); foreach (XElement server in doc.Descendants("Server").Except(new XElement[] { server1 }).ToList()) { server.Add(childNodes); } doc.Save("output.xml"); }
and you will get a result like
<Root> <Server Name="Server1" ID="601" Size="A"> <ConfiguredNode></ConfiguredNode> <Node Number="1"></Node> <ModelDetails></ModelDetails> <DataSaved>True</DataSaved> <!-- .... --> </Server> <Server Name="Server2" ID="602" Size="A"> <ConfiguredNode></ConfiguredNode> <Node Number="1"></Node> <ModelDetails></ModelDetails> <DataSaved>True</DataSaved> <!-- .... --> </Server> <Server Name="Server3" ID="603" Size="A"> <ConfiguredNode></ConfiguredNode> <Node Number="1"></Node> <ModelDetails></ModelDetails> <DataSaved>True</DataSaved> <!-- .... --> </Server> <Server Name="Server4" ID="604" Size="A"> <ConfiguredNode></ConfiguredNode> <Node Number="1"></Node> <ModelDetails></ModelDetails> <DataSaved>True</DataSaved> <!-- .... --> </Server> <Server Name="Server5" ID="605" Size="A"> <ConfiguredNode></ConfiguredNode> <Node Number="1"></Node> <ModelDetails></ModelDetails> <DataSaved>True</DataSaved> <!-- .... --> </Server> </Root>
MVP Data Platform Development My blog
- Marked As Answer by bvpavan Thursday, October 11, 2012 2:20 PM
-
Thursday, October 11, 2012 2:20 PMThanks Martin...Worked like a charm :)
Pavan Kumar B.V
- Edited by bvpavan Thursday, October 11, 2012 3:08 PM

