2011-01-20 4 views
9

J'ai une fonction qui prend comme argument un objet XDocument.Créer un XDocument à partir d'un document XDocument existant

Je dois parcourir un certain nombre d'autres objets dans une collection différente et, pour chacun de ces objets, effectuer certaines actions sur le XDocument. Mais chaque itération du lopp nécessite une copie vierge de l'original XDocument transmis à la fonction. Cependant, si j'essaie simplement d'effectuer mes opérations sur la variable qui est passée dans la fonction, elle se comporte comme un pointeur - donc chaque itération de la boucle reçoit le XDocument dans l'état où il se trouvait à la fin de la dernière itération est inutile du tout.

De toute évidence, j'ai besoin de faire une copie de la Xdocument mais je ne vois pas de moyen simple de le faire. Essayer:

XDocument currentServerXml = XDocumentFromFunction.Document(): 

Et puis en utilisant currentServerXml au lieu de XDocumentFromFunction me fait la même copie avec le même pointeur et le même comportement. Comment puis-je créer une toute nouvelle copie des données pour chaque itération de la boucle?

Comment puis-je créer une nouvelle copie des données pour chaque itération de la boucle?

+0

vous a bien examiné également le clonage de votre XDocument comme je l'ai suggéré? – Filburt

Répondre

17

Vous recherchez le XDocument constructor qui prend un XDocument. Cela va créer une copie profonde du XDocument passé.

Exemple de code:

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

Enregistrez le document XDocument dans un flux et chargez une autre instance de ce flux.

EDIT: Vous pouvez implémenter une méthode d'extension "CreateCopy()" qui peut encapsuler cette solution, afin que vous puissiez avoir votre solution facile à utiliser que vous demandez.

+0

Je n'ai pas de méthode de surcharge pour XDocument qui accepte un flux. –

+0

Merci pour votre suggestion, mais ce n'est pas beaucoup d'aide si je ne peux pas enregistrer le XDocument à un flux! Je ne comprends pas pourquoi je ne vois pas de surcharge pour .Save qui accepte un flux - est-ce que je manque un espace de noms ou quelque chose? –

+0

J'ai vérifié cela et XDocument a une surcharge Save (Stream)! : D Ici vous avez la liste de surcharge: http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.save.aspx Laissez-moi savoir si vous pouvez l'utiliser! –

0

Un flux serait la meilleure option que l'autre répondant a suggéré. Toutefois, pour les personnes coincées dans ma position de ne pas être en mesure d'utiliser un flux, la méthode la plus simple est d'utiliser un TextReader à la place:

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

Voila!

0

Que diriez-vous de MemberwiseClone?

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