2013-04-03 44 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。