Можно ли записать XML в память с помощью XmlWriter?
Я создаю ASHX, который возвращает XML, но он ожидает путь, когда я делаю
XmlWriter writer = XmlWriter.Create(returnXML, settings)
Но returnXML - это просто пустая строка прямо сейчас (предположим, что это не сработает), однако мне нужно написать XML, чтобы я мог отправить текст ответа. Я попробовал XmlDocument, но это дало мне ошибку, ожидающую строку. Что мне здесь не хватает?
Ответы
Ответ 1
Если вы действительно хотите записать в память, перейдите в StringWriter
или StringBuilder
следующим образом:
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);
}
}
Если вы хотите написать его непосредственно в ответ, однако, вы можете передать HttpResponse.Output
, который вместо TextWriter
:
using (XmlWriter writer = XmlWriter.Create(Response.Output, settings))
{
// Write into it here
}
Ответ 2
Что-то не хватало на моей стороне: очистка буфера 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);
}
Ответ 3
Лучший способ сделать это - написать непосредственно в выходной поток ответа. Его поток, встроенный в ASP.NET, позволяет вам писать любой вывод в виде потока, в этом случае вы можете записать XML на него.
Ответ 4
StringBuilder xml = new StringBuilder();
TextWriter textWriter = new StringWriter(xml);
XmlWriter xmlWriter = new XmlTextWriter(textWriter);
Затем используйте xmlWriter, чтобы выполнить всю запись xml, и которая записывает его непосредственно в StringBuilder.
Редактировать: Спасибо Jon Skeet комментарий:
StringBuilder xml = new StringBuilder();
XmlWriter xmlWriter = XmlWriter.Create(xml);