2011-01-20 1 views
9

Ho una funzione che accetta come argomento un oggetto XDocument.Creare un nuovo XDocument da un XDocument esistente

Ho bisogno di passare in rassegna un numero di altri oggetti in una collezione diversa e per ognuno di questi oggetti, eseguire alcune azioni su XDocument. Ma ogni iterazione di lopp richiede una copia originaria dell'XDocument originale passato alla funzione.

Tuttavia, se provo a eseguire le operazioni sulla variabile passata alla funzione, si comporta come un puntatore, quindi ogni iterazione del ciclo riceve l'XDocument in qualunque stato sia rimasto alla fine dell'ultima iterazione che è inutile.

Ovviamente ho bisogno di fare una copia di Xdocument ma non vedo un modo semplice per farlo. Cercando:

XDocument currentServerXml = XDocumentFromFunction.Document(): 

E quindi utilizzando currentServerXml invece di XDocumentFromFunction mi fa la stessa copia con lo stesso puntatore e lo stesso comportamento.

Come è possibile creare una nuova copia dei dati per ogni iterazione del ciclo?

+0

Avete considerato anche clonare il vostro XDocument come ho suggerito? – Filburt

risposta

17

Stai cercando il XDocument constructor che prende un XDocument. Questo creerà una copia profonda dell'XDocument passato.

codice di esempio:

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

Salvare l'XDocument in uno stream e caricare un'altra istanza da quel flusso.

MODIFICA: è possibile implementare un metodo di estensione "CreateCopy()" che potrebbe incapsulare tale soluzione, in modo da poter disporre della soluzione di facile utilizzo che si sta richiedendo.

+0

Non ho un metodo di overload per XDocument che accetta uno stream. –

+0

Grazie per il tuo suggerimento ma non è di grande aiuto se non riesco a salvare l'XDocument in streaming! Non capisco perché non vedo un sovraccarico di .Save che accetta un flusso - mi manca uno spazio dei nomi o qualcosa del genere? –

+0

L'ho verificato e XDocument ha un sovraccarico di Save (Stream)! : D Ecco la lista di overload: http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.save.aspx Fammi sapere se potresti usarla! –

0

Un flusso sarebbe l'opzione migliore come suggerito dall'altro rispondente. Tuttavia per chiunque bloccato nella mia posizione di non essere in grado di utilizzare un flusso, il metodo più semplice è quello di utilizzare un TextReader invece:

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

Voila!

0

Che ne dici di MemberwiseClone?

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