Создать новый XDocument из существующего XDocument - PullRequest
9 голосов
/ 20 января 2011

У меня есть функция, которая принимает в качестве аргумента объект XDocument.

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

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

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

 XDocument currentServerXml = XDocumentFromFunction.Document():

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

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

Ответы [ 4 ]

17 голосов
/ 24 января 2012

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

Пример кода:

var foo_original = XDocument.Load("foo.xml");
var foo_copy1 = new XDocument(foo_original);
var foo_copy2 = new XDocument(foo_original);
0 голосов
/ 20 января 2011

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

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

Voila!

0 голосов
/ 20 января 2011

Как насчет MemberwiseClone?

XDocument newdoc = XDocumentFromFunction.Document().MemberwiseClone();
0 голосов
/ 20 января 2011

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

РЕДАКТИРОВАТЬ: вы можете реализовать метод расширения "CreateCopy ()", который может инкапсулировать это решение, чтобы вы могли получить простое в использовании решение, которое вы запрашиваете.

...