2013-04-03 15 views
8

Sto cercando di creare una nuova XDocument come segue:Come ottenere una copia indipendente di un XDocument?

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

XDocument xml = XDocument.Parse(xmlString); 

ora ho xml che avrei se fosse un'istanza autonoma di un documento perché ho estratto la stringa dal documento originale e ha creato uno nuovo da quello.

Ma quando modifico xml e poi ispeziono il _documentDictionary[documentKey] posso vedere che anche il documento originale è stato modificato.

Come posso ottenere un nuovo documento indipendente dalla raccolta esistente che ho?

Nota:

ho provato questi ma non funziona:

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

e

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

risposta

27

C'è un copy constructor defined for XDocument class:

var newDoc = new XDocument(xml); 

Si utilizza questo costruttore per creare una copia profonda di un XDocument.

Questo costruttore attraversa tutti i nodi e gli attributi nel documento specificato nell'altro parametro e crea le copie di tutti i nodi come assembla il nuovo XDocument inizializzato.

Test rapido

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" e name2 è "Test", quali prove che le modifiche apportate sul doc non incidono doc2.

+0

L'ho provato ma non sembra funzionare. Darò un altro colpo. – DaveDev

+0

+1 non lo sapevo –

+0

C'è qualcosa di strano in corso. Ho appena provato il tuo test e funziona, ma quando lo provo sui miei oggetti sta fallendo.Creo il nuovo documento e lo modifico, cambiando il nome della radice come hai descritto e posso vedere che viene aggiornato nell'originale. – DaveDev

4

Provare a copiare il costruttore, come;

var newDoc = new XDocument(xml); 

Da MSDN:

si utilizza questo costruttore per fare una copia completa di un XDocument.

Questo costruttore attraversa tutti i nodi e gli attributi nel documento specificato nell'altro parametro e crea le copie di tutti i nodi come assembla il nuovo XDocument inizializzato.

Problemi correlati