XmlWriter एक फ़ाइल के बजाय एक स्ट्रिंग लिखने के लिए


118

मेरे पास एक WCF सेवा है जिसे XML की स्ट्रिंग वापस करने की आवश्यकता है। लेकिन ऐसा लगता है कि लेखक केवल एक फ़ाइल का निर्माण करना चाहता है, न कि एक स्ट्रिंग। मैंने कोशिश की:

string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))

यह एक त्रुटि उत्पन्न करता है जिसमें कहा गया है कि nextXMLstring के पास फ़ाइल पथ नहीं है। यह कुछ इस तरह चाहता है:

using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))

मैं अपना XML कैसे बना सकता हूं और फिर इसे एक स्ट्रिंग के रूप में वापस कर सकता हूं ??

धन्यवाद!!

जवाबों:


217

आपको एक StringWriter बनाने और XmlWriter को पास करने की आवश्यकता है।

XmlWriter.Create का स्ट्रिंग अधिभार एक फ़ाइल नाम के लिए है।

उदाहरण के लिए

using (var sw = new StringWriter()) {
  using (var xw = XmlWriter.Create(sw)) {
    // Build Xml with xw.


  }
  return sw.ToString();
}

2
@Will: अपने परिवर्तन को वापस लाया। XmlTextWriter.Close () धारा में बह जाएगा, ताकि स्ट्रिंग निकालने से पहले ऐसा हो। (इस मामले में थोड़ा अंतर है, लेकिन इसे लगातार करना पसंद करते हैं क्योंकि * लेखक और स्ट्रीम कक्षाओं के फ्लश शब्दार्थ स्पष्ट रूप से प्रलेखित नहीं हैं।)
रिचर्ड

1
इसका उपयोग करने वाले लोगों के लिए बस एक टिप्पणी। यदि आप उपयोग () को छोड़ना चाहते हैं और इसके बजाय अपने XmlWriter को सामान्य रूप से घोषित करते हैं, तो सुनिश्चित करें कि आप sww कॉल करने से पहले xw.Flush को कॉल करें। (या तो) या आपको सभी सामग्री नहीं मिल सकती हैं! (स्पष्ट रूप से उपयोग करने वाले कोष्ठक का उपयोग करने के लिए बेहतर है ...)
रावेन्द्रकस्की

जो निम्न कोड कोड विश्लेषण के दौरान CA2202 चेतावनी देता है ध्यान में रखें, निपटान वजह से () विधि दो बार StringWriter वस्तु पर बुलाया जाएगा
Łukasz Kosiak

113

जैसा कि रिचर्ड ने कहा, StringWriterआगे का रास्ता है। हालाँकि, एक रोड़ा है: डिफ़ॉल्ट रूप से, StringWriterअपने आप को UTF-16 में होने के नाते विज्ञापित करेगा। आमतौर पर XML UTF-8 में होता है। आप इसे StringWriter को उपवर्ग में ठीक कर सकते हैं;

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}

इससे लिखित घोषणा प्रभावित होगी XmlWriter। बेशक, यदि आप फिर बाइनरी रूप में स्ट्रिंग को कहीं और लिखते हैं, तो सुनिश्चित करें कि आप एक एन्कोडिंग का उपयोग करते हैं जो आपके लिए ठीक करने वाले एन्कोडिंग से मेल खाती है StringWriter। (उपरोक्त कोड हमेशा UTF-8 मानता है; यह एक अधिक सामान्य संस्करण बनाने के लिए तुच्छ है जो कंस्ट्रक्टर में एन्कोडिंग स्वीकार करता है।)

आप तब उपयोग करेंगे:

using (TextWriter writer = new Utf8StringWriter())
{
    using (XmlWriter xmlWriter = XmlWriter.Create(writer))
    {
        ...
    }
    return writer.ToString();
}

जॉन, क्या आप सुनिश्चित हैं कि writerएक से अधिक बार निपटाया नहीं जा रहा है?
rasx

2
@rasx: यह हो सकता है - लेकिन इससे कोई फर्क नहीं पड़ेगा।
जॉन स्कीट

30

मुझे पता है कि यह पुराना है और इसका जवाब दिया गया है, लेकिन यहां यह करने का एक और तरीका है। विशेष रूप से यदि आप अपने स्ट्रिंग की शुरुआत में UTF8 BOM नहीं चाहते हैं और आप पाठ इंडेंट करना चाहते हैं:

using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false)) 
                   { Formatting = Formatting.Indented })
{
     // ...
     return Encoding.UTF8.GetString(ms.ToArray());
}

3
Encoding.UTF8.GetString(ms.ToArray())आपकी वापसी पर सरलीकरण है।
स्लीवरनिंजा - MSFT

1
ms.ToArray()जब मैंने यह कोशिश की तो कोई वस्तु नहीं मिली। x.Close()आंतरिक विवरण के उपयोग के ठीक बाहर रिटर्न स्टेटमेंट को जोड़ना या स्थानांतरित करना था ।
रिच सी

Utf8.GetString (ms.GetBuffer (), 0, (int) ms.Length) करता है; काम?
ब्रायनरी

1
@ रीच सी - मुझे संदेह है क्योंकि आपकी धारा प्रवाहित नहीं हुई थी। XmlTextWriter को इसके उपयोग कथन के बाहर निपटाया गया होगा जिससे यह प्रवाहित हो जाएगा।
Yourbuddypal

13

उपयोग करें StringBuilder:

var sb = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(sb))
    {
        ...
    }
return sb.ToString();

1

दोस्तों xmlWriter.Close () और xmlWriter.Dispose () कॉल करना न भूलें वरना आपका स्ट्रिंग बनाना समाप्त नहीं होगा। यह सिर्फ एक रिक्त स्ट्रिंग होगी


चिंता न करें, कथन का उपयोग करने से ऑब्जेक्ट का निपटान होगा।

यह 2009 से एक सवाल है। इसलिए, अब जवाब देने का मूल्य भविष्य के उपयोगकर्ताओं के लिए होगा, जिनके समान मुद्दे हो सकते हैं। नतीजतन, इस तरह के पुराने प्रश्नों के उत्तर केवल तभी प्रदान किए जाने चाहिए जब वे स्पष्ट रूप से समस्या की पहचान कर सकें और समाधान बता सकें / प्रदान कर सकें। आमतौर पर ओपी को बातचीत में शामिल करने की कोशिश करना फलदायी होता है क्योंकि उनके स्थानांतरित होने की संभावना होती है।
22

मैं इन सभी उदाहरणों से गुजर रहा था और मुझे आश्चर्य था कि मुझे खाली स्ट्रिंग क्यों मिलती है। xmlWriter.Close()समाधान था।
राफेल Ryszkowski

-1

वैसे मुझे लगता है कि यहाँ सबसे सरल और सबसे तेज़ समाधान सिर्फ इसके लिए होगा:

StringBuilder sb = new StringBuilder();

using (var writer = XmlWriter.Create(sb, settings))
{
    ... // Whatever code you have/need :)

    sb = sb.Replace("encoding=\"utf-16\"", "encoding=\"utf-8\""); //Or whatever uft you want/use.
    //Before you finally save it:
    File.WriteAllText("path\\dataName.xml", sb.ToString());
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.