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 を music にコピーしたいので、結果の 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と#4で私を助けてくれませんか?

4

2 に答える 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、それらをそのノードに挿入できます(コピーしたノードの子である必要があると仮定します)

于 2012-05-22T07:39:57.467 に答える
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);
于 2012-05-22T07:40:52.363 に答える