2009-03-25 14 views
18

Estoy creando un ASHX que devuelve XML sin embargo, espera un camino cuando lo haga¿Es posible escribir XML en la memoria con XmlWriter?

XmlWriter writer = XmlWriter.Create(returnXML, settings) 

Pero returnXML es sólo una cadena vacía en este momento (supongo que no funciona), sin embargo tengo que escribir el código XML a algo que puedo enviar como texto de respuesta. Intenté XmlDocument pero me dio un error al esperar una cadena. ¿Que me estoy perdiendo aqui?

Respuesta

42

Si realmente desea escribir en la memoria, pasar en un StringWriter o una StringBuilder así:

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); 
    } 
} 

Si desea escribir directamente a la respuesta, sin embargo, usted podría pasar en HttpResponse.Output que es TextWriter una vez:

using (XmlWriter writer = XmlWriter.Create(Response.Output, settings)) 
{ 
    // Write into it here 
} 
2

la mejor manera de hacerlo es escribir directamente al flujo de salida de respuesta. Es una secuencia incorporada en ASP.NET que le permite escribir cualquier salida como una secuencia, en este caso puede escribir XML en ella.

+2

Sugiero escribiendo en la salida en lugar de OutputStream. ¿Por qué molestarse en construir un StreamWriter alrededor de un Stream cuando Output ya lo proporciona? –

+0

En este caso, estoy de acuerdo que probablemente tengas razón. Lo digo porque, a juzgar por el fragmento proporcionado, ya ha almacenado todo el documento como una cadena (returnXML), por lo que lo más fácil es simplemente escribir esa cadena en Response.Output y evitar XmlWriters por completo. – Steve

+0

No, returnXml era lo que esperábamos pasar * a * la llamada XmlWriter.Create. Sospecho que solo puede salirse con XmlWriter.Create (Response.Output, settings) –

2
StringBuilder xml = new StringBuilder(); 
    TextWriter textWriter = new StringWriter(xml); 
    XmlWriter xmlWriter = new XmlTextWriter(textWriter); 

A continuación, utilice el XMLWriter hacer todo lo escrito en XML, y que lo escribe directamente a la StringBuilder.

Edit: Gracias al comentario de Jon Skeet:

StringBuilder xml = new StringBuilder(); 
    XmlWriter xmlWriter = XmlWriter.Create(xml); 
+0

No necesita usar StringWriter aquí - XmlWriter.Create acepta un StringBuilder directamente. –

+0

Oh genial, tienes razón. Nunca me di cuenta de eso. Gracias. Revisé Reflector ahora, y como sospechaba, internamente se creó un StringWriter. ¡Gracias por el aporte! Editaré mi respuesta. – BFree

6

Algo faltaba en mi lado: el lavado de amortiguamiento de la 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); 
} 
+0

He perdido horas con el mismo problema al generar un StringBuilder con un XmlWriter. ¡Nunca olvides tirar! – Ted

Cuestiones relacionadas