Подтвердить что ты не робот

Можно ли записать XML в память с помощью XmlWriter?

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

XmlWriter writer = XmlWriter.Create(returnXML, settings)

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

4b9b3361

Ответ 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);