2009-03-25 25 views
18

tôi đang tạo ra một ASHX trả về XML tuy nhiên nó hy vọng một con đường khi tôi làmCó thể ghi XML vào bộ nhớ bằng XmlWriter không?

XmlWriter writer = XmlWriter.Create(returnXML, settings) 

Nhưng returnXML chỉ là một chuỗi rỗng ngay bây giờ (đoán rằng sẽ không hoạt động), tuy nhiên tôi cần phải viết XML với thứ gì đó mà tôi có thể gửi dưới dạng văn bản phản hồi. Tôi đã thử XmlDocument nhưng nó đã cho tôi một lỗi mong đợi một chuỗi. Tôi đang thiếu gì ở đây?

Trả lời

42

Nếu bạn thực sự muốn viết vào bộ nhớ, vượt qua trong một StringWriter hoặc một StringBuilder như thế này:

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

Nếu bạn muốn viết nó trực tiếp đến phản ứng, tuy nhiên, bạn có thể vượt qua trong HttpResponse.Output đó là a TextWriter thay thế:

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

Cách tốt nhất để làm điều đó là viết trực tiếp vào Luồng đầu ra phản hồi. Dòng của nó được tích hợp sẵn cho ASP.NET để cho phép bạn viết bất kỳ đầu ra nào dưới dạng luồng, trong trường hợp này bạn có thể viết XML cho nó.

+2

Tôi đề nghị bằng văn bản cho Output hơn OutputStream. Tại sao phải xây dựng một StreamWriter xung quanh một Stream khi Output đã cung cấp? –

+0

Trong trường hợp này, tôi đồng ý rằng bạn có thể đúng. Tôi nói rằng vì đánh giá bằng đoạn mã được cung cấp, anh ta đã có toàn bộ tài liệu được lưu trữ dưới dạng chuỗi (returnXML), do đó, điều dễ nhất là chỉ viết chuỗi đó vào Response.Output và tránh XmlWriters hoàn toàn. – Steve

+0

Không, returnXml là những gì chúng tôi hy vọng sẽ chuyển * vào * cuộc gọi XmlWriter.Create. Tôi nghi ngờ ông chỉ có thể nhận được đi với XmlWriter.Create (Response.Output, cài đặt) –

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

Sau đó, sử dụng xmlWriter để thực hiện tất cả văn bản xml và ghi trực tiếp lên StringBuilder.

Edit: Nhờ bình luận Jon Skeet:

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

Bạn không cần phải sử dụng StringWriter ở đây - XmlWriter.Create chấp nhận một StringBuilder trực tiếp. –

+0

Rất tuyệt, bạn nói đúng. Tôi chưa bao giờ để ý điều đó. Cảm ơn. Tôi đã kiểm tra Reflector bây giờ mặc dù, và như tôi nghi ngờ, trong nội bộ một StringWriter được tạo ra. Cảm ơn các đầu vào! Tôi sẽ chỉnh sửa câu trả lời của mình. – BFree

6

Something đã mất tích đứng về phía tôi: đỏ bừng mặt đệm của 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

Tôi đã lãng phí giờ với cùng một vấn đề với xuất ra một StringBuilder với một XmlWriter. Đừng bao giờ quên tuôn ra! – Ted

Các vấn đề liên quan