El XmlReader
puede o no estar respaldado por un Stream
. He engañado con algunos métodos usando la reflexión para intentar obtener el Stream
o el TextWriter
respaldando el XmlReader, pero al final creo que es probablemente más sencillo escribir el objeto en una nueva transmisión; Recomendaría este método sobre la respuesta aceptada porque la respuesta aceptada no funcionará muy bien en documentos grandes, y esta es básicamente una versión simplificada de lo que hará la versión de BizTalk en la respuesta de Jay (BizTalk hace una detección automática de si debe utilizar un FileStream
o MemoryStream
y tiene alguna otra manejo especial para el XML):
public static class XmlExtensions
{
public static MemoryStream ToStream(this XmlReader reader)
{
MemoryStream ms = new MemoryStream();
reader.CopyTo(ms);
return ms;
}
public static FileStream ToStream(this XmlReader reader, string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Create);
reader.CopyTo(fs);
return fs;
}
public static void CopyTo(this XmlReader reader, Stream s)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.CheckCharacters = false; // don't get hung up on technically invalid XML characters
settings.CloseOutput = false; // leave the stream open
using (XmlWriter writer = XmlWriter.Create(s, settings))
{
writer.WriteNode(reader, true);
}
}
}
CopyTo
le permitirá configurar su corriente de la manera que quieras; ToStream
le ofrece un par de casos comunes útiles en los que simplemente desea obtener rápidamente un MemoryStream
regular (para archivos XML más pequeños) o use un FileStream
(para los más grandes).
Por supuesto, al final, si es que realmente estás haciendo esto para fines de serialización, que sería bueno añadir sólo una sobrecarga a su clase de serialización como:
XMySerializer.Deserialize(XmlReader reader, object graph)
Tanto XmlSerializer
y en DataContractSerializer
el BCL sigue esa idea ...
Tenga en cuenta que esto tiene la sobrecarga de decodificar el XML codificado [generalmente UTF8] (con la mayoría de los bytes individuales por carácter), a una cadena donde cada carácter es de dos bytes (algunos caracteres son más I pensar). Por lo tanto, hay que considerar el costo de decodificación de texto y la huella de memoria de doble tamaño. – redcalx