Возможно ли записать XML в память с помощью XmlWriter? - PullRequest
18 голосов
/ 25 марта 2009

Я создаю ASHX, который возвращает XML, однако он ожидает путь, когда я делаю

XmlWriter writer = XmlWriter.Create(returnXML, settings)

Но returnXML - это сейчас просто пустая строка (думаю, это не сработает), однако мне нужно написать XML-код для чего-то, что я мог бы затем отправить в качестве текста ответа. Я попробовал XmlDocument, но он выдал ошибку, ожидающую строку. Что мне здесь не хватает?

Ответы [ 4 ]

43 голосов
/ 25 марта 2009

Если вы действительно хотите записать в память, передайте 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
}
6 голосов
/ 09 марта 2012

Что-то не хватало на моей стороне: очистка буфера 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 голосов
/ 25 марта 2009
    StringBuilder xml = new StringBuilder();
    TextWriter textWriter = new StringWriter(xml);
    XmlWriter xmlWriter = new XmlTextWriter(textWriter);

Затем используйте xmlWriter для выполнения всей записи xml, и это записывает ее непосредственно в StringBuilder.

Редактировать: Благодаря комментарию Джона Скита:

    StringBuilder xml = new StringBuilder();
    XmlWriter xmlWriter = XmlWriter.Create(xml);
2 голосов
/ 25 марта 2009

Лучший способ сделать это - записать напрямую в поток вывода ответа. Это встроенный в ASP.NET поток, позволяющий записывать любой вывод в виде потока, в этом случае вы можете записать в него XML.

...