2013-04-03 39 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"name2爲​​,改變對doc做出不影響doc2什麼證據。

+0

我試過了,但它似乎沒有工作。我會再試一次。 – DaveDev

+0

+1不知道那個 –

+0

有一些奇怪的事情發生。我只是嘗試過你的測試,它的工作原理,但是當我嘗試對自己的對象進行測試時,它是失敗的。我創建了新文檔並對其進行了修改,如您所描述的那樣更改了根名稱,我可以看到它正在被更新。 – DaveDev

4

嘗試複製構造函數,如;

var newDoc = new XDocument(xml); 

MSDN

您可以使用此構造,使一個XDocument的深副本。

此構造函數遍歷其他參數中指定的文檔 中的所有節點和屬性,並創建所有節點的副本,如 它組裝新初始化的XDocument。