2010-04-09 19 views
5

Dada una instancia de XDocument, ¿cómo puedo obtener fácilmente un TextReader que represente esa instancia?¿Cómo puedo obtener fácilmente un TextReader desde un XDocument?

El mejor que he podido llegar a algo como esto (donde xml es una instancia XDocument):

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

xml.Save(sw); 

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

TextReader tr = new StreamReader(s); 

Sin embargo, esto parece un poco torpe, así que me preguntaba si hay una manera más fácil?


Editar

El ejemplo anterior es equivalente a la conversión de toda la instancia a una cadena XML y luego crear un TextReader sobre esa cadena.

Me preguntaba si hay una forma más fluida de hacerlo que leer todo el contenido en la memoria.

+0

Marca: me acabo de ocurrir que a veces uso un "inversor de flujo continuo" para los casos en que un API quiere escribir en un flujo y necesito leer de él (es decir, para un resultado de acción). Esto podría adaptarse para hacer un "inversor de escritor de texto", que esencialmente le daría acceso real a través de 'XDocument.Save', pero la desventaja es que requiere un hilo adicional para ejecutarse. ¿Eso lo ayudaría aquí? – Aaronaught

+0

@Aaronaught: Gracias, pero eso es probablemente demasiado para pensarlo. Principalmente hice la pregunta por curiosidad. En mi edición actual, espero analizar un pequeño fragmento de XML al inicio de la aplicación, así que definitivamente puedo vivir cargando todo el documento a la vez. –

+0

De acuerdo, pensé que estabas tratando de enviarlo a través de una red o algo por el estilo. Tengo curiosidad por saber por qué necesitas hacer esto, ¿estás usando una API XML que solo puede aceptar un 'TextReader'? – Aaronaught

Respuesta

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

Bondad,

Dan

+0

Bueno, eso es definitivamente mejor que mi enfoque original, pero todavía no es lo que estoy buscando (ver mi pregunta editada). Sin embargo, +1 uno para darme una alternativa de una línea :) –

+0

Quizás agregaría que la llamada a 'TextReader' debería envolverse con' using' ya que implementa 'IDisposable'. –

0

Yo no lo he probado, pero no es un método XNode.WriteTo(XmlWriter). Puede pasarlo a XmlTextWriter para obtener una representación textual. Esto probablemente tome algo más de código para escribir, pero debería ser más "corriente-como" como usted pidió :-)

[Editar:] Aún más fácil: Hay un método XNode.CreateReader() que le da una XmlReader. Simplemente tendrá que manejar la conversión para enviar un mensaje de texto.

+0

Sí, pero ese es el problema. A menos que me falta algo, no hay una conversión fácil de XmlReader a TextReader. –

Cuestiones relacionadas