Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I clone a xml element using Linq to Xml

I would like to clone a Xml element, insert it to the end of the element list and save the document. Could someone explain how it is done in linq to xml

Xml

  <Folders>
    <Folder ID="1" Name="Music" PathValue="Root/Music" ParentId="0"></Folder>
    <Folder ID="2" Name="Rock" PathValue="Root/Rock" ParentId="1"></Folder>
  </Folders>

Context

think of the xml element Folder as Virtual folder on disk. I would like to copy the folder Rock into music hence the resulting xml should become as below

Result Required

  <Folders>
    <Folder ID="1" Name="Music" PathValue="Root/Music" ParentId="0"></Folder>
    <Folder ID="2" Name="Rock" PathValue="Root/Rock" ParentId="0"></Folder>
    <Folder ID="3" Name="Rock" PathValue="Root/Music/Rock" ParentId="1"></Folder>
  </Folders>

Operations to be carried out

  1. Clone the source node ( Done #1)
  2. Clone the other nodes inside source node ( Don't know how to do it #2)
  3. Generate new ID for the nodes inside #2 and change pathvalue ( I know how to do this)
  4. Insert the node #1 and nodes from #2 ( Don't know)

1

var source = new XElement((from folder in _xmlDataSource.Descendants("Folders").Descendants("Folder") where
wallet.Attribute("ID").Value.Equals(sourceWalletId, StringComparison.OrdinalIgnoreCase) select wallet).First());
//source is a clone not the reference to node.

2

var directChildren = (from folder in _xmlDataSource.Descendants("Folders").Descendants("Folder") where folder.Attribute("PathValue").Value.Contains(sourcePathValue) select folder);
//How do i clone this

Question

Could someone help me with #2 and #4?

like image 995
Deeptechtons Avatar asked Dec 27 '22 00:12

Deeptechtons


1 Answers

You know about the constructor that takes another XElement to create a copy of it, have you tried this?

var copiedChildren = from folder in _xmlDataSource.Descendants("Folders").Descendants("Folder") 
                     where folder.Attribute("PathValue").Value.Contains(sourcePathValue) 
                     select new XElement(folder);

as you have already cloned source, you can insert those into that node (assuming they should be children of the copied node)

like image 69
Botz3000 Avatar answered Jan 08 '23 11:01

Botz3000