XmlDocument को स्ट्रिंग में बदलें


218

यहां बताया गया है कि वर्तमान में मैं XMLDocument को स्ट्रिंग में कैसे परिवर्तित कर रहा हूं

StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

इस पद्धति के साथ समस्या यह है कि अगर मेरे पास " ((उद्धरण) जो मेरे पास हैं, तो यह उनसे बच जाता है)।

उदाहरण के लिए:

<Campaign name="ABC">
</Campaign>

ऊपर एक्सएमएल अपेक्षित है। लेकिन यह लौट आता है

<Campaign name=\"ABC\">
</Campaign>

मैं String.Replace "\" कर सकता हूँ, लेकिन क्या यह तरीका ठीक है? क्या कोई भी दुष्प्रभाव हैं? क्या यह ठीक काम करेगा अगर XML में "\" हो

जवाबों:


180

कोई उद्धरण नहीं है। यह सिर्फ VS डिबगर है। कंसोल पर प्रिंटिंग या किसी फ़ाइल को सहेजने का प्रयास करें और आप देखेंगे। एक साइड नोट के रूप में: हमेशा डिस्पोजेबल वस्तुओं का निपटान करें:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}

2
usingब्लॉक का उपयोग करने के लिए कोड को ठीक करने के लिए +1 और नहीं XmlTextWriter
जॉन सॉन्डर्स

1
वर्थिंग नोटिंग (जैसा कि यहां टिप्पणी में उल्लेख किया गया है: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ) जब तक आप XmlWriter की करीबी विधि नहीं कहते हैं, तब तक तत्व और विशेषताएं नहीं लिखी जाएंगी।
टन

उनमें से कुछ तुरंत लिखे जा सकते हैं। यह बफरिंग पर निर्भर करता है। भले ही, मैंने एक कॉल जोड़ा Flush, हालांकि ब्लॉक को Closeबंद करने या बस xmlTextWriter usingको पूरा करने के लिए कॉल एक ही होगा।
ब्रायन

12
Xml को सुंदर बनाने के लिए, इस सेटिंग ऑब्जेक्ट को XmlWriter.Create में पास करें: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
एडम ब्रुक

655

मान लें कि xmlDoc एक xmlDocument ऑब्जेक्ट है जो xmlDoc.OuterXml के साथ गलत है?

return xmlDoc.OuterXml;

OuterXml संपत्ति एक्सएमएल के एक स्ट्रिंग संस्करण देता है।


3
वैसे आप सही हैं। मैंने पहले कोशिश की, लेकिन जब मैंने डिबगर में उद्धरण देखे। मैंने सोचा कि इसकी वजह से बाहरी बॉक्स और StringWriter विधि का प्रयास करें। लेकिन मैं गलत था उद्धरण केवल डीबगर में थे। तो मैं सिर्फ OuterXml का उपयोग करूँगा। धन्यवाद
akif

मेरे लिए काम किया! बस xmlDoc पर एक अशक्त जाँच करें! रिटर्न xmlDoc == अशक्त? "xmlDoc शून्य है": xmlDoc.OuterXml;
सर्जनवेबदेव

1
@ सर्जनवेबदेव अगर आपको लगता है कि आपकी वस्तु अशक्त हो सकती है, तो अशक्त-जाँच बिना कहे और यहाँ हर उत्तर के लिए जाती है; और वास्तव में C में किसी ऑब्जेक्ट के साथ प्रत्येक इंटरैक्शन के लिए - व्यक्तिगत रूप से मैं यह सुनिश्चित करने की कोशिश करता हूं कि ऑब्जेक्ट्स हमेशा निर्मित होते हैं ताकि मुझे हर जगह null-check के साथ कोड ब्लोट न करना पड़े ... मुझे लगता है कि यह आपके कोड बेस पर निर्भर करता है .. ।
क्रिस मॉट्रे 6

10
(y) लेकिन OuterXml में घोषणात्मक टैग शामिल नहीं है? xml संस्करण = "1.0" एन्कोडिंग = "utf-16"?>
hazjack

3
@hazjack यदि आप घोषणात्मक टैग चाहते हैं तो XmlDeclaration Class का उपयोग करें। msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - यदि आप इसे फाइल में लिखना चाहते हैं तो फिर सेव मेथड का उपयोग करें। आप पर XmlDocument उदाहरण msdn.microsoft.com/en-us/library/dw229a22.aspx - मेरे लिए घोषणात्मक टैग केवल तभी समझ में आता है यदि आप फ़ाइल लिखने के लिए लिख रहे हैं और सी # स्ट्रिंग नहीं
क्रिस मैथ्रे सेप

10

यदि आप Windows.Data.Xml.Dom.XmlDocumentसंस्करण का उपयोग कर रहे हैं XmlDocument(उदाहरण के लिए UWP ऐप्स में प्रयुक्त), तो आप yourXmlDocument.GetXml()XML को एक स्ट्रिंग के रूप में प्राप्त करने के लिए उपयोग कर सकते हैं ।


5

एक विस्तार विधि के रूप में:

public static class Extensions
{
    public static string AsString(this XmlDocument xmlDoc)
    {
        using (StringWriter sw = new StringWriter())
        {
            using (XmlTextWriter tx = new XmlTextWriter(sw))
            {
                xmlDoc.WriteTo(tx);
                string strXmlText = sw.ToString();
                return strXmlText;
            }
        }
    }
}

अब बस उपयोग करने के लिए:

yourXmlDoc.AsString()

यह उदाहरण दो लेखकों पर Dispose को कॉल करने में विफल रहता है।
जोएल मुलर

2

"\"डीबगर में के रूप में दिखाया गया है, लेकिन डेटा स्ट्रिंग में सही है, और आपको कुछ भी बदलने की आवश्यकता नहीं है। अपने स्ट्रिंग को फ़ाइल में डंप करने का प्रयास करें और आप ध्यान देंगे कि स्ट्रिंग सही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.