Possibile scrivere XML a memoria con XmlWriter?
Domanda
Sto creando un ASHX che restituisce XML tuttavia si aspetta un percorso quando faccio
XmlWriter writer = XmlWriter.Create(returnXML, settings)
Ma returnXML è solo una stringa vuota in questo momento (immagino che non funziona), ma ho bisogno di scrivere il codice XML per qualcosa che posso quindi inviare il testo di risposta. Ho provato XmlDocument ma mi ha dato un errore in attesa di una stringa. Che cosa mi manca qui?
Soluzione
Se si vuole veramente scrivere nella memoria, passare un StringWriter
o un StringBuilder
in questo modo:
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);
}
}
Se si desidera scrivere direttamente alla risposta, tuttavia, si potrebbe passare HttpResponse.Output
che è un TextWriter
invece:
using (XmlWriter writer = XmlWriter.Create(Response.Output, settings))
{
// Write into it here
}
Altri suggerimenti
Mancava qualcosa dalla mia parte: vampate di calore buffer della 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);
}
StringBuilder xml = new StringBuilder();
TextWriter textWriter = new StringWriter(xml);
XmlWriter xmlWriter = new XmlTextWriter(textWriter);
Quindi, utilizzare la xmlWriter per fare tutta la scrittura di XML, e che scrive direttamente al StringBuilder.
Edit: Grazie al commento di Jon Skeet:
StringBuilder xml = new StringBuilder();
XmlWriter xmlWriter = XmlWriter.Create(xml);
Il modo migliore per farlo è quello di scrivere direttamente nel flusso di output di risposta. Il suo un flusso che è built-in ad ASP.NET per consentire di scrivere tutto ciò che in uscita come un flusso, in questo caso è possibile scrivere XML ad esso.