2011-01-20 4 views
9

У меня есть функция, которая принимает в качестве аргумента объект XDocument.Создайте новый XDocument из существующего XDocument

Мне нужно прокрутить несколько других объектов в другой коллекции и для каждого из этих объектов выполнить некоторые действия над XDocument. Но каждая итерация lopp нуждается в нетронутой копии исходного XDocument, который передается функции.

Однако, если я просто попытаюсь выполнить свои операции над переменной, переданной в функцию, она ведет себя как указатель, поэтому каждая итерация цикла получает XDocument в любом состоянии, которое оно оставалось в конце последней итерации, вообще не используется.

Очевидно, мне нужно сделать копию Xdocument, но я не вижу простого способа сделать это. Попытка:

XDocument currentServerXml = XDocumentFromFunction.Document(): 

А затем с помощью currentServerXml вместо XDocumentFromFunction получает меня тот же экземпляр с тем же указателем и такое же поведение.

Как создать новую копию данных для каждой итерации цикла?

+0

Вы также рассмотреть вопрос о клонировании свой XDocument, как я предложил? – Filburt

ответ

17

Вы ищете XDocument constructor, который принимает XDocument. Это создаст глубокую копию переданного XDocument.

Пример кода:

var foo_original = XDocument.Load("foo.xml"); 
var foo_copy1 = new XDocument(foo_original); 
var foo_copy2 = new XDocument(foo_original); 
0

Сохраните XDocument в потоке и загрузите другой экземпляр из этого потока.

EDIT: вы можете реализовать метод расширения «CreateCopy()», который может инкапсулировать это решение, поэтому вы можете получить свое простое в использовании решение, которое вы запрашиваете.

+0

У меня нет метода перегрузки для XDocument, который принимает поток. –

+0

Спасибо за ваше предложение, но это не очень поможет, если я не могу сохранить XDocument в поток! Я не понимаю, почему я не вижу перегрузки для .Save, который принимает поток - я пропускаю пространство имен или что-то еще? –

+0

Я проверил это, и у XDocument есть сбой (поток)! : D Здесь у вас есть список перегрузок: http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.save.aspx Сообщите мне, можете ли вы его использовать! –

0

Поток был бы лучшим вариантом, как предложил другой респондент. Однако для тех, кто застрял в моем положении, чтобы не быть в состоянии использовать поток, самый простой способ заключается в использовании TextReader вместо:

  TextReader tr = new StringReader(myXDocument.ToString()); 
      XDocument copyOfMyXDocument = XDocument.Load(tr); 

Вуаля!

0

Как насчет MemberwiseClone?

XDocument newdoc = XDocumentFromFunction.Document().MemberwiseClone();