2013-04-03 6 views
8

私は次のように新しいXDocumentを作成しようとしています:XDocumentの独立したコピーを取得するには?

var xmlString = _documentDictionary[documentKey].ToString(SaveOptions.DisableFormatting); 

XDocument xml = XDocument.Parse(xmlString); 

私は今、私は元の文書から文字列を抽出して作成したので、私も持っているだろうxmlは、文書のスタンドアロンインスタンスだった持っていますそれからの新しいもの。

しかし、xmlを変更して_documentDictionary[documentKey]を調べると、元のドキュメントも変更されていることがわかります。

私が持っている既存のコレクションから新しい独立したドキュメントを取得するにはどうすればよいですか?

注:

私はこれらを試してみたが、それは動作しません:

var xmlString = _documentDictionary[documentKey].ToString(SaveOptions.DisableFormatting); 
var copyDoc = new XDocument(xmlString); 

var copyDoc = new XDocument(_documentDictionary[documentKey]); 

答えて

27

copy constructor defined for XDocument classがあります:

var newDoc = new XDocument(xml); 

このコンストラクタを使用して、XDocumentのディープコピーを作成します。

このコンストラクタは、他のパラメータで指定されたドキュメント のすべてのノードと属性をトラバースし、すべてのノードのコピーを として作成し、新しく初期化されたXDocumentをアセンブルします。

クイックテスト

var doc = new XDocument(new XElement("Test")); 
var doc2 = new XDocument(doc); 

doc.Root.Name = "Test2"; 

string name = doc.Root.Name.ToString(); 
string name2 = doc2.Root.Name.ToString(); 

name"Test2"あるとname2doc2に影響を与えませんdocで行った変更​​、どのような証拠です。

+0

私はそれを試みましたが、うまくいかないようです。私は別のショットを与えるでしょう。 – DaveDev

+0

+1はそれについて知らなかった –

+0

何か変わったことが起こっている。私はちょうどあなたのテストを試して、それは動作しますが、私は自分のオブジェクトでそれを試してみると失敗しています。私は新しい文書を作成してそれを修正し、記述したようにルート名を変更すると、元の文書で更新されていることがわかります。 – DaveDev

4

のようにコンストラクタをコピーしてみてください。 MSDNから

var newDoc = new XDocument(xml); 

あなたはXDocumentの深いコピーを作成するために、このコンストラクタを使用します。

このコンストラクタは、他のパラメータで指定されたドキュメント のすべてのノードと属性をトラバースし、すべてのノードのコピーを として作成し、新しく初期化されたXDocumentをアセンブルします。

関連する問題