2009-03-25 5 views
18

मैं एक ashx कि XML रिटर्न लेकिन यह एक पथ की उम्मीद है जब मैंएक्सएमएलवाइटर के साथ मेमोरी में एक्सएमएल लिखना संभव है?

XmlWriter writer = XmlWriter.Create(returnXML, settings) 

करते लेकिन returnXML अभी (लगता है कि काम नहीं करेगा) सिर्फ एक खाली स्ट्रिंग है बनाने रहा हूँ, लेकिन मैं एक्सएमएल लिखने की ज़रूरत कुछ ऐसा करने के लिए जिसे मैं प्रतिक्रिया पाठ के रूप में भेज सकता हूं। मैंने XmlDocument की कोशिश की लेकिन मुझे एक स्ट्रिंग की उम्मीद में त्रुटि मिली। मुझे यहां क्या समझ नहीं आ रहा है?

उत्तर

42

तुम सच में स्मृति में लिखने के लिए, एक 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

ऐसा करने के लिए सबसे अच्छा तरीका है रिस्पांस आउटपुट स्ट्रीम करने के लिए सीधे लिखने के लिए है। यह एक स्ट्रीम है जो एएसपी.नेट में अंतर्निहित है ताकि आप स्ट्रीम के रूप में जो भी आउटपुट लिख सकें, इस मामले में आप इसे एक्सएमएल लिख सकते हैं।

+2

मैं OutputStream बजाय आउटपुट के लिए लिख सुझाव देते हैं। जब आउटपुट पहले से ही प्रदान करता है तो स्ट्रीम के चारों ओर स्ट्रीमवाइटर बनाने के लिए परेशान क्यों करें? –

+0

इस मामले में, मैं सहमत हूं कि आप शायद सही हैं। मैं कहता हूं कि प्रदान किए गए स्निपेट द्वारा निर्णय लेने के कारण, उसे पहले से ही एक स्ट्रिंग (returnXML) के रूप में संग्रहीत पूरा दस्तावेज़ मिल गया है, इसलिए सबसे आसान बात यह है कि केवल उस स्ट्रिंग को Response.Output पर लिखना और XmlWriters से पूरी तरह से बचें। – Steve

+0

नहीं, returnXml वह था जिसे हम * एक्सएमएलवाइटर * में * पास करने की उम्मीद कर रहे थे। कॉल करें। मुझे संदेह है कि वह सिर्फ एक्सएमएलवाइटर से बाहर निकल सकता है। क्रिएट (प्रतिक्रिया। आउटपुट, सेटिंग्स) –

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

फिर, xmlWriter उपयोग करने वाले सभी एक्सएमएल लेखन करने के लिए, और है कि यह StringBuilder के लिए सीधे लिखते हैं।

संपादित करें: जॉन स्कीट की टिप्पणी के लिए धन्यवाद:

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

आपको स्ट्रिंगवाइटर का उपयोग करने की आवश्यकता नहीं है - XmlWriter.Create सीधे स्ट्रिंगबिल्डर को स्वीकार करता है। –

+0

ओह शांत, आप सही हैं। मैंने कभी यह नहीं देखा। धन्यवाद। मैंने अभी प्रतिबिंबक जांच की है, और जैसा कि मुझे संदेह है, आंतरिक रूप से एक स्ट्रिंगवाइटर बनाया गया है। इनपुट के लिए धन्यवाद! मैं अपना जवाब संपादित करूंगा। – BFree

6

कुछ मेरी तरफ याद आ रही थी: 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

मैंने XmlWriter के साथ स्ट्रिंगबिल्डर को आउटपुट करने के साथ एक ही समस्या के साथ घंटों बर्बाद कर दिए हैं। फ्लश करना कभी न भूलें! – Ted