2011-01-20 11 views
9

Tengo una función que toma como argumento un objeto XDocument.Crear un nuevo XDocument a partir de un XDocument existente

Necesito recorrer varios otros objetos en una colección diferente y para cada uno de esos objetos, realizar algunas acciones en el XDocument. Pero cada iteración de lopp necesita una copia prístina del XDocument original que se pasa a la función.

Sin embargo, si solo trato de realizar mis operaciones sobre la variable que pasa a la función, se comporta como un puntero, por lo que cada iteración del bucle recibe el XDocument en el estado que quedó al final de la última iteración que no sirve para nada

Obviamente necesito hacer una copia del Xdocument pero no veo una manera directa de hacerlo. Tratando:

XDocument currentServerXml = XDocumentFromFunction.Document(): 

Y a continuación, utilizando currentServerXml en lugar de XDocumentFromFunction me pone la misma copia con el mismo índice y el mismo comportamiento.

¿Cómo puedo crear una nueva copia de los datos para cada iteración del ciclo?

+0

¿Usted también consideran la clonación de su XDocument como he sugerido? – Filburt

Respuesta

17

Usted está buscando el XDocument constructor que toma un XDocument. Esto creará una copia profunda del XDocument pasado.

Código de ejemplo:

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

Guarde el XDocument en una secuencia y cargue otra instancia de esa secuencia.

EDITAR: Puede implementar un método de extensión "CreateCopy()" que puede encapsular esa solución, para que pueda tener la solución fácil de usar que está solicitando.

+0

No tengo un método de sobrecarga para XDocument que acepte una transmisión. –

+0

Gracias por su sugerencia, pero no es de mucha ayuda si no puedo guardar el XDocument en una transmisión. No entiendo por qué no veo una sobrecarga para .Guardar que acepta una transmisión. ¿Me falta un espacio de nombres o algo así? –

+0

¡Lo he comprobado y XDocument tiene una sobrecarga Save (Stream)! : D Aquí tienes la lista de sobrecarga: http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.save.aspx ¡Avísame si podrías usarla! –

0

Una transmisión sería la mejor opción como sugirió la otra parte. Sin embargo para cualquier persona atrapada en mi posición de no ser capaz de utilizar una corriente, el método más simple es utilizar un TextReader lugar:

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

Voila!

0

¿Qué tal MemberwiseClone?

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