2010-10-06 9 views
32

साथ स्ट्रिंग के लिए लिखने के लिए मैं घोषणा के साथ और UTF-8 एन्कोडिंग के साथ एक स्ट्रिंग के लिए एक्सएमएल लिखने में सक्षम होना चाहता हूँ। यह पूरा करने के लिए शक्तिशाली मुश्किल लगता है।फोर्स XDocument UTF-8 एन्कोडिंग

मैं थोड़ा के आसपास पढ़ सकते हैं और इस के लिए लोकप्रिय कुछ उत्तर की कोशिश की लेकिन वे सभी मुद्दे है। मेरा वर्तमान कोड यूटीएफ -8 के रूप में सही ढंग से आउटपुट करता है लेकिन एक्सडॉक्यूमेंट (यानी इंडेंट्स/व्हाइटस्पेस) के मूल स्वरूपण को बनाए रखता है!

किसी को कुछ सलाह दे सकते हैं, कृपया?

XDocument xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), xelementXML); 

MemoryStream ms = new MemoryStream(); 
using (XmlWriter xw = new XmlTextWriter(ms, Encoding.UTF8)) 
{ 
    xml.Save(xw); 
    xw.Flush(); 

    StreamReader sr = new StreamReader(ms); 
    ms.Seek(0, SeekOrigin.Begin); 

    String xmlString = sr.ReadToEnd(); 
} 

एक्सएमएल तरह से करने के लिए समान होना स्वरूपण की आवश्यकता है .ToString() यानी स्वरूपित हैं

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<root> 
    <node>blah</node> 
</root> 

क्या मैं वर्तमान में दिखाई दे रही है

<?xml version="1.0" encoding="utf-8" standalone="yes"?><root><node>blah</node></root> 

मेरे पास है अद्यतनXmlTextWriter सेटिंग्स जोड़कर इसे काम करने में कामयाब रहा ... हालांकि यह बहुत मुश्किल लगता है !

MemoryStream ms = new MemoryStream(); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Encoding = Encoding.UTF8; 
settings.ConformanceLevel = ConformanceLevel.Document; 
settings.Indent = true; 
using (XmlWriter xw = XmlTextWriter.Create(ms, settings)) 
{ 
    xml.Save(xw); 
    xw.Flush(); 

    StreamReader sr = new StreamReader(ms); 
    ms.Seek(0, SeekOrigin.Begin); 
    String blah = sr.ReadToEnd(); 
} 
+0

क्या स्वरूपण 'को दे? आपने स्वरूपण के बारे में कुछ भी नहीं कहा है! – AakashM

+0

सामान्य खाली स्थान के/स्वरूपण है कि आप एक 'XDocument' या पर अगर आप सिर्फ एक' .ToString() 'के लिए मिलता है' XElement' – Chris

+0

एक नमूना इनपुट दस्तावेज़ तो हम जवाब का परीक्षण कर सकते दे। –

उत्तर

53

इस प्रयास करें:

using System; 
using System.IO; 
using System.Text; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     XDocument doc = XDocument.Load("test.xml", 
             LoadOptions.PreserveWhitespace); 
     doc.Declaration = new XDeclaration("1.0", "utf-8", null); 
     StringWriter writer = new Utf8StringWriter(); 
     doc.Save(writer, SaveOptions.None); 
     Console.WriteLine(writer); 
    } 

    private class Utf8StringWriter : StringWriter 
    { 
     public override Encoding Encoding { get { return Encoding.UTF8; } } 
    } 
} 
बेशक

, आप हमें कैसे आप दस्तावेज़ है, जो यह परीक्षण करने के लिए कठिन बना देता है का निर्माण कर रहे नहीं पता चला है ... मैं सिर्फ एक के साथ की कोशिश की है हाथ से निर्मित XDocument और इसमें प्रासंगिक व्हाइटस्पेस भी शामिल है।

+0

एक इलाज करता है, धन्यवाद - स्ट्रिंगवाइटर से विरासत के बिना एन्कोडिंग क्रमबद्ध करने का कोई तरीका नहीं है? – Chris

+0

@Chris: यह हो रही TextWriter एन्कोडिंग कि TextWriter का विज्ञापन करता है की अनदेखी करने को ओवरलोड के कुछ रास्ता है * कि * संभव है, लेकिन मैं यह एक बहुत आसान काम किया जाना हैक होने के लिए मिल गया है। (आपको केवल एक ही स्थान पर इसकी आवश्यकता है ...) –

+0

हाँ मुझे यह पसंद है - यह जिस तरीके से आया था उससे बेहतर है। धन्यवाद – Chris

2

कोशिश XmlWriterSettings:

XmlWriterSettings xws = new XmlWriterSettings(); 
xws.OmitXmlDeclaration = false; 
xws.Indent = true; 

और यह की तरह

using (XmlWriter xw = XmlWriter.Create(sb, xws)) 
संबंधित मुद्दे