2009-03-25 23 views
18

ancak ben XML yazmak gerekiyor, benXmlWriter ile belleğe XML yazmak mümkün mü?

XmlWriter writer = XmlWriter.Create(returnXML, settings) 

yaptığınızda bir yol beklediğini Ama returnXML (bu işe yaramaz sanırım) şu anda sadece boş bir dizedir ancak XML döndüren bir ashx oluşturma daha sonra cevap metni olarak gönderebileceğim bir şeye. XmlDocument denedim ama bir dize bekliyor bir hata verdi. Burada neyi özlüyorum?

cevap

42

Eğer gerçekten bir StringWriter geçmek, belleğe yazmak istiyorsanız veya böyle bir StringBuilder: Eğer yanıt doğrudan yazmak istiyorsanız

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

Ancak, hangi HttpResponse.Output içinde geçebileceği bir TextWriter yerine:

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

bunu yapmanın en iyi yolu Tepki Çıktı Akım doğrudan yazmaktır. Bir akış olarak herhangi bir çıktıyı yazmanıza olanak tanımak için ASP.NET'e yerleşik bir akış, bu durumda ona XML yazabilirsiniz.

+2

Ben OutputStream yerine Çıktı yazılı öneririz. Çıktı zaten bunu sağladığında neden bir StreamWriter oluşturulsun? –

+0

Bu durumda, muhtemelen haklı olduğunuzu kabul ediyorum. Sunulan pasajı yargılamaktan dolayı, zaten tüm belgeyi bir dize (returnXML) olarak kaydetmiş olduğunu söylüyorum, bu yüzden en kolay şey sadece bu dizeyi Response.Output'a yazmak ve XmlWriters'ı tamamen önlemek. – Steve

+0

Hayır, returnXml, XmlWriter.Create çağrısına * girmeyi umuyorduk. XmlWriter.Create (Response.Output, settings) –

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

Ardından tüm xml yazma yapmak XMLwriter kullanmak ve bu StringBuilder doğrudan yazar.

Düzenleme: Jon Skeet yorumuna teşekkürler:

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

Burada StringWriter kullanmanız gerekmez - XmlWriter.Create doğrudan bir StringBuilder kabul eder. –

+0

Harika, haklısın. Bunu hiç fark etmedim. Teşekkürler. Reflector'u şimdi kontrol ettim ve şüphelendiğim gibi dahili olarak bir StringWriter oluşturuldu. Giriş için teşekkürler! Cevabımı düzenlerim. – BFree

6

Something yanımda eksikti: XMLwriter en tampon yıkama:

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

Bir XmlWriter ile bir StringBuilder'e çıktılamada aynı sorunla saat harcadım. Temizlemeyi asla unutma! – Ted

İlgili konular