2013-04-03 3 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 является "Test", какие доказательства того, что изменения, сделанные на doc не влияют на doc2.

+0

Я пробовал это, но он, похоже, не работает. Я сделаю еще один выстрел. – DaveDev

+0

+1 не знал об этом –

+0

Есть что-то странное. Я просто пробовал ваш тест, и он работает, но когда я пытаюсь использовать его на своих объектах, он терпит неудачу.Я создаю новый документ и изменяю его, изменяя имя корня, как вы описали, и я вижу, что он обновляется в оригинале. – DaveDev

4

Попробуйте скопировать конструктор, например;

var newDoc = new XDocument(xml); 

От MSDN:

Вы можете использовать этот конструктор, чтобы сделать глубокий копию XDocument.

Этот конструктор пересекает все узлы и атрибуты в документе , указанном в другом параметре, и создает копии всех узлов как , он собирает вновь инициализированный XDocument.

Смежные вопросы