如何使用Linq到xml克隆xml元素

如何使用Linq到xml克隆xml元素,xml,linq,linq-to-xml,xelement,Xml,Linq,Linq To Xml,Xelement,我想克隆一个Xml元素,将其插入元素列表的末尾并保存文档。有人能解释一下它是如何在LINQtoXML中实现的吗 Xml 2. 问题: 有人能帮我处理#2和#4吗?你知道用另一个元素创建副本的构造函数,你试过这个吗 var copiedChildren = from folder in _xmlDataSource.Descendants("Folders").Descendants("Folder") where folder.Attribute("P

我想克隆一个Xml元素,将其插入元素列表的末尾并保存文档。有人能解释一下它是如何在LINQtoXML中实现的吗

Xml 2. 问题:
有人能帮我处理#2和#4吗?

你知道用另一个元素创建副本的构造函数,你试过这个吗

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

由于您已经克隆了
source
,因此可以将它们插入到该节点中(假设它们应该是复制节点的子节点)

如果您只关心复制嵌套在源元素中的元素,可以使用以下方法:

XDocument xdoc = new XDocument("filename");
XElement source = xdoc.Root.Elements("Folder").Where(f => f.Attribute("ID") == "1").First();
XElement target = new XElement(source);
target.Add(new XAttribute("ParentId", source.Attribute("ID"));

// TODO update ID and PathValue of target
xdoc.Root.Add(target);
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.
var directChildren = (from folder in _xmlDataSource.Descendants("Folders").Descendants("Folder") where folder.Attribute("PathValue").Value.Contains(sourcePathValue) select folder);
//How do i clone this
var copiedChildren = from folder in _xmlDataSource.Descendants("Folders").Descendants("Folder") 
                     where folder.Attribute("PathValue").Value.Contains(sourcePathValue) 
                     select new XElement(folder);
XDocument xdoc = new XDocument("filename");
XElement source = xdoc.Root.Elements("Folder").Where(f => f.Attribute("ID") == "1").First();
XElement target = new XElement(source);
target.Add(new XAttribute("ParentId", source.Attribute("ID"));

// TODO update ID and PathValue of target
xdoc.Root.Add(target);