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();