valor recorrer parsear obtener nodos modificar manipular leer lector elementos cargar c# xml-serialization stream iostream datacontractserializer

parsear - recorrer elementos de un xml c#



DataContractSerializer: cómo puedo generar el xml en una cadena(en lugar de un archivo) (5)

Tuve una pregunta rápida sobre el datacontractserializer. Tal vez es más una pregunta de flujo. Encontré un fragmento de código que escribe el xml en una cadena de archivos. Básicamente no quiero el archivo y solo necesito el resultado de la cadena.

public static string DataContractSerializeObject<T>(T objectToSerialize) { var fs = new FileStream("test.xml", FileMode.OpenOrCreate); var serializer = new DataContractSerializer(typeof(T)); serializer.WriteObject(fs, objectToSerialize); fs.Close(); return fs.ToString(); }

fs.ToString () obviamente no es lo que estoy buscando. ¿Qué secuencia o escritor, etc., puedo usar solo para devolver la cadena correcta y no crear un archivo? Miré el XML creado por filestream y es exactamente lo que estoy buscando. El XmlSerializer escribió el XML un poco extraño y prefiero el resultado del DataContractSerializer en este caso. ¿Alguien puede señalarme en la dirección correcta?


Algo como esto: coloque su salida en un MemoryStream y luego vuelva a leerla en:

public static string DataContractSerializeObject<T>(T objectToSerialize) { using(MemoryStream memStm = new MemoryStream()) { var serializer = new DataContractSerializer(typeof(T)); serializer.WriteObject(memStm, objectToSerialize); memStm.Seek(0, SeekOrigin.Begin); using(var streamReader = new StreamReader(memStm)) { string result = streamReader.ReadToEnd(); return result; } } }


Gracias a @ xr280xr por señalar mi eliminación olvidada de StringWriter en el primer borrador.

/// <summary> /// Converts this instance to XML. /// </summary> /// <returns>XML representing this instance.</returns> public string ToXml() { var serializer = new DataContractSerializer(this.GetType()); using (var output = new StringWriter()) using (var writer = new XmlTextWriter(output) { Formatting = Formatting.Indented }) { serializer.WriteObject(writer, this); return output.GetStringBuilder().ToString(); } }


Sugiero combinar los métodos dados por Pat y marc_s :

public static string DataContractSerializeObject<T>(T objectToSerialize) { using (var output = new StringWriter()) using (var writer = new XmlTextWriter(output) {Formatting = Formatting.Indented}) { new DataContractSerializer(typeof (T)).WriteObject(writer, objectToSerialize); return output.GetStringBuilder().ToString(); } }


Una variante de la respuesta de @ root:

var serializer = new DataContractSerializer(typeof(T)); var sb = new StringBuilder(); using (var writer = XmlWriter.Create(sb)) { serializer.WriteObject(writer, objectToSerialize); } return sb.ToString();


Y aún más fácil:

var serializer = new DataContractSerializer(typeof(T)); var sb = new StringBuilder(); using (var writer = XmlWriter.Create(sb)) { serializer.WriteObject(writer, objectToSerialize); writer.Flush(); return sb.ToString(); }