c# - example - Posible escribir XML a la memoria con XmlWriter?
xmlwriter genexus (4)
Estoy creando un ASHX que devuelve XML sin embargo, espera una ruta cuando lo hago
XmlWriter writer = XmlWriter.Create(returnXML, settings)
Pero returnXML es solo una cadena vacía en este momento (supongo que no funcionará), sin embargo, necesito escribir el XML en algo que luego pueda enviar como texto de respuesta. Intenté XmlDocument pero me dio un error esperando una cadena. ¿Que me estoy perdiendo aqui?
Algo faltaba de mi lado: vaciar el búfer de XmlWriter:
static void Main()
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("root");
writer.WriteStartElement("element");
writer.WriteString("content");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
}
Console.WriteLine(builder);
}
La mejor manera de hacerlo es escribir directamente en el flujo de salida de respuesta. Es un flujo integrado en ASP.NET que le permite escribir cualquier salida como un flujo, en este caso, puede escribir XML en él.
Si realmente quieres escribir en la memoria, pasa un StringWriter
o un StringBuilder
como este:
using System;
using System.Text;
using System.Xml;
public class Test
{
static void Main()
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("root");
writer.WriteStartElement("element");
writer.WriteString("content");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
Console.WriteLine(builder);
}
}
Sin embargo, si desea escribirlo directamente en la respuesta, puede pasar HttpResponse.Output
que es un TextWriter
en TextWriter
lugar:
using (XmlWriter writer = XmlWriter.Create(Response.Output, settings))
{
// Write into it here
}
StringBuilder xml = new StringBuilder();
TextWriter textWriter = new StringWriter(xml);
XmlWriter xmlWriter = new XmlTextWriter(textWriter);
Luego, use xmlWriter para hacer toda la escritura xml, y eso lo escribe directamente en el StringBuilder.
Edit: Gracias al comentario de Jon Skeet:
StringBuilder xml = new StringBuilder();
XmlWriter xmlWriter = XmlWriter.Create(xml);