如何使用Linq to Xml克隆一个XML元素

4

我想克隆一个Xml元素,将其插入到元素列表的末尾并保存文档。有人能解释一下在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>

背景

将xml元素Folder视为磁盘上的虚拟文件夹。我想将文件夹Rock复制到音乐文件夹中,因此所需的xml应如下所示:

所需结果

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

需要执行的操作

  1. 克隆源节点(已完成 #1)
  2. 克隆源节点内部的其他节点(不知道如何做 #2)
  3. 为 #2 内部的节点生成新的 ID 并更改路径值(我知道如何做这一步)
  4. 插入 #1 节点 和来自 #2 的节点(不知道如何做)

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

问题

有人能帮我解决第二个和第四个问题吗?

2个回答

7

你知道使用一个 XElement 构造函数来创建其副本吗?尝试过吗?

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

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


3

如果你只关心复制源元素内嵌的元素,你可以使用以下代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接