2010-04-09 16 views
5

Data un'istanza XDocument, come posso ottenere facilmente un TextReader che rappresenta quell'istanza?Come posso ottenere facilmente un TextReader da un XDocument?

Il meglio che ho potuto venire in mente è qualcosa di simile (dove xml è un'istanza XDocument):

var s = new MemoryStream(); 
var sw = new StreamWriter(s); 

xml.Save(sw); 

sw.Flush(); 
s.Position = 0; 

TextReader tr = new StreamReader(s); 

Tuttavia, questo sembra un po 'goffo, quindi mi chiedevo se c'è un modo più semplice?


Modifica

L'esempio precedente è equivalente a convertire l'intera istanza di una stringa XML e quindi creare un TextReader su tale stringa.

Mi stavo chiedendo se c'è un modo più simile a un flusso per farlo che leggere l'intero contenuto in memoria.

+0

Mark: mi è appena venuto in mente che a volte utilizzo un "inverter di flusso" per i casi in cui alcune API desiderano scrivere su un flusso e ho bisogno di leggerlo (ad esempio per un ActionResult). Questo potrebbe essere adattato per creare un "text writer inverter", che essenzialmente ti darà un vero accesso in streaming tramite 'XDocument.Save', ma il lato negativo è che richiede un thread aggiuntivo per l'esecuzione. Ti aiuterebbe qui? – Aaronaught

+0

@Aaronaught: Grazie, ma probabilmente è troppo per farcela. Ho principalmente chiesto la domanda per curiosità. Nel mio numero attuale, mi aspetto di analizzare un piccolo frammento di XML all'avvio dell'applicazione, quindi posso sicuramente vivere con il caricamento dell'intero documento in una sola volta. –

+0

Alrighty, ho pensato che stavi cercando di inviarlo su una rete o qualcosa del genere. Sono curioso di sapere perché devi fare questo, stai usando un'API XML che può solo accettare un 'TextReader'? – Aaronaught

risposta

3
TextReader tr = new StringReader(xml.ToString()); 

Gentilezza,

Dan

+0

Beh, questo è decisamente migliore del mio approccio originale, ma ancora non proprio quello che sto cercando (vedi la mia domanda modificata). Tuttavia, +1 uno per darmi un'alternativa di una riga :) –

+0

Vorrei aggiungere che chiamare 'TextReader' dovrebbe essere incluso con' using' dato che implementa 'IDisposable'. –

0

non l'ho provato, ma c'è un metodo XNode.WriteTo(XmlWriter). Si potrebbe passare un XmlTextWriter per ottenere una rappresentazione testuale. Questo probabilmente ci vorrà un po 'più di codice di scrivere, ma dovrebbe essere più "stream-like" come da voi richiesto :-)

[Edit:] Ancora più facile: c'è un metodo XNode.CreateReader() che vi dà un XmlReader. Dovrai solo gestire la conversione in testo da solo.

+0

Sì, ma questo è il problema. A meno che non manchi qualcosa, non c'è conversione facile da XmlReader a TextReader. –

Problemi correlati