txt sobrescribir sobreescribir leer generar escribir creación creacion como archivos archivo c# xml

c# - sobrescribir - XmlWriter para escribir en una cadena en lugar de en un archivo



leer y escribir archivo txt c# (5)

Tengo un servicio WCF que necesita devolver una cadena de XML. Pero parece que el escritor solo quiere construir un archivo, no una cadena. Lo intenté:

string nextXMLstring = ""; using (XmlWriter writer = XmlWriter.Create(nextXMLstring))

Esto genera un error al decir que nextXMLstring no tiene una ruta de archivo. Quiere algo como:

using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))

¿Cómo puedo construir mi XML y luego devolverlo como una cadena?

¡¡Gracias!!


Como dijo Richard, StringWriter es el camino a seguir. Sin embargo, hay un inconveniente: de forma predeterminada, StringWriter se anunciará como UTF-16. Por lo general, XML está en UTF-8. Puede solucionar esto creando una subclase de StringWriter;

public class Utf8StringWriter : StringWriter { public override Encoding Encoding { get { return Encoding.UTF8; } } }

Esto afectará la declaración escrita por XmlWriter . Por supuesto, si luego escribes la cadena en otro lugar en forma binaria, asegúrate de usar una codificación que coincida con la codificación que arregles para StringWriter . (El código anterior siempre asume UTF-8, es trivial hacer una versión más general que acepte una codificación en el constructor).

Luego usarías:

using (TextWriter writer = new Utf8StringWriter()) { using (XmlWriter xmlWriter = XmlWriter.Create(writer)) { ... } return writer.ToString(); }


Los chicos no se olviden de llamar a xmlWriter.Close () y xmlWriter.Dispose () o de lo contrario su cadena no terminará de crearse. Solo será una cadena vacía


Necesita crear un StringWriter y pasarlo a XmlWriter.

La sobrecarga de cadena de XmlWriter.Create es para un nombre de archivo.

P.ej

using (var sw = new StringWriter()) { using (var xw = XmlWriter.Create(sw)) { // Build Xml with xw. } return sw.ToString(); }


Sé que esto es viejo y respondí, pero esta es otra forma de hacerlo. Particularmente si no desea la BOM UTF8 al comienzo de su cadena y desea que el texto se sangre:

using (var ms = new MemoryStream()) { using (var x = new XmlTextWriter(ms, new UTF8Encoding(false))    { Formatting = Formatting.Indented }) {   // ...   return Encoding.UTF8.GetString(ms.ToArray()); } }


Use StringBuilder :

var sb = new StringBuilder(); using (XmlWriter xmlWriter = XmlWriter.Create(sb)) { ... } return sb.ToString();