2009-03-25 7 views
18

ich eine ASHX bin erstellen, die XML gibt jedoch erwartet, dass es einen Weg, wenn ichMöglich, mit XmlWriter XML in den Speicher zu schreiben?

XmlWriter writer = XmlWriter.Create(returnXML, settings) 

Aber returnXML ist nur eine leere Zeichenfolge jetzt (denke, das wird nicht funktionieren) zu tun, aber ich brauche die XML zu schreiben zu etwas, das ich dann als Antworttext senden kann. Ich habe versucht, XmlDocument, aber es gab mir einen Fehler erwartet eine Zeichenfolge. Was fehlt mir hier?

Antwort

42

Wenn Sie wirklich in den Speicher schreiben wollen, in einem StringWriter oder ein StringBuilder wie dies passieren:

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

Wenn Sie es auf die Antwort direkt schreiben möchten, aber Sie könnten in HttpResponse.Output passieren, das ist ein TextWriter statt:

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

der beste Weg, das zu tun, ist direkt mit dem Response-Output Stream zu schreiben. Es ist ein Stream, der in ASP.NET integriert ist, damit Sie jede Ausgabe als Stream schreiben können. In diesem Fall können Sie XML in diesen Stream schreiben.

+2

Ich schlage vor, das Schreiben auf Output statt Output. Warum sollte man einen StreamWriter um einen Stream herum erstellen, wenn Output das bereits bietet? –

+0

In diesem Fall würde ich zustimmen, dass Sie wahrscheinlich Recht haben. Ich sage das, weil er anhand des bereitgestellten Snippets bereits das gesamte Dokument als String (returnXML) gespeichert hat. Daher ist es am einfachsten, diese Zeichenfolge nur in Response.Output zu schreiben und XmlWriters vollständig zu vermeiden. – Steve

+0

Nein, returnXml wollten wir * in * den XmlWriter.Create-Aufruf übergeben. Ich vermute, er kann nur mit XmlWriter.Create (Response.Output, Einstellungen) durchkommen –

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

Verwenden Sie dann die xmlWriter alle xml Schreiben zu tun, und das schreibt sie direkt an den Stringbuilder.

Edit: Dank Jon Skeet Kommentar:

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

Sie müssen den StringWriter hier nicht verwenden - XmlWriter.Create akzeptiert einen StringBuilder direkt. –

+0

Oh cool, du hast Recht. Das habe ich nie bemerkt. Vielen Dank. Ich habe Reflector jetzt überprüft, und wie ich vermutete, wird intern ein StringWriter erstellt. Danke für die Eingabe! Ich werde meine Antwort bearbeiten. – BFree

6

Es fehlte etwas auf meiner Seite: den Puffer des XmlWriter Spülung:

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

Ich habe Stunden mit dem gleichen Problem verschwendet mit der Ausgabe zu einem StringBuilder mit einem XmlWriter. Vergiss nie zu spülen! – Ted

Verwandte Themen