2011-11-02 10 views
5

मैं ब्राइंडेड एंटरप्राइज़ एक्सएमएल एपीआई के लिए एक रैपर लिख रहा हूं। मेरे पास एक एक्स डॉक्यूमेंट है जो मुझे स्ट्रिंग में बदलने की ज़रूरत है। तथ्य यह है कि उनके XML पार्सर तो नकचढ़ा है कि यह भी एक्सएमएल नोड्स के बीच खाली स्थान के संभाल सकते है के कारण, दस्तावेज़ घोषणा बिल्कुल किया जाना चाहिए:स्ट्रिंग के लिए XDocument: घोषणा में एन्कोडिंग को कैसे छोड़ें?

<?xml version="1.0"?> 

हालांकि, XDocument.Save() विधि हमेशा कोई एन्कोडिंग कहते हैं कि घोषणा में विशेषता:

<?xml version="1.0" encoding="utf-16"?> 

पिछले एक घंटे पर गूगल और ढेर का सबसे अच्छा तरीका एक्सएमएल स्ट्रिंग उत्पन्न करने के लिए की तलाश में खर्च के साथ, सबसे अच्छा मैं क्या कर सकते हैं:

string result = xmlStringBuilder.ToString().Replace(@"encoding=""utf-16"", string.Empty)); 

मैं

xdoc.Declaration = new XDeclaration("1.0", null, null); 

की कोशिश की है और कहा कि जिस तरह से मैं यह चाहते XDocument में घोषणा की स्थापना में सफल होता है; हालांकि, जब मैं सेव() विधि को कॉल करता हूं, तो एन्कोडिंग विशेषता को वहां पर जादुई रूप से फेंक दिया जाता है, इससे कोई फर्क नहीं पड़ता कि मैं किस मार्ग पर जाता हूं (टेक्स्टवाइटर का उपयोग करके, XmlWriterSettings, आदि जोड़ना)।

क्या किसी के पास ऐसा करने का बेहतर तरीका है, या क्या मेरा कोड हमेशा के लिए घृणास्पद स्ट्रिंग के ऊपर टिप्पणियों में रेंगने का अनुच्छेद करने के लिए बर्बाद हो गया है?

उत्तर

10

वैसे प्राप्त करने वाला अंत एक्सएमएल पार्सर का उपयोग करने के लिए तय किया जाना चाहिए और कुछ ऐसा नहीं जो एक्सएमएल सिंटैक्स के साथ टूटता है लेकिन .NET के साथ यदि आप एक्सएमएल घोषणा के साथ एक स्ट्रिंग बनाना चाहते हैं, तो आपने निम्न पोस्ट को मेरे लिए काम किया है:

public class MyStringWriter : StringWriter 
{ 
    public override Encoding Encoding 
    { 
     get 
     { 
      return null; 
     } 
    } 
} 

और फिर

XDocument doc = new XDocument(
     new XDeclaration("1.0", null, null), 
     new XElement("root", "test") 
     ); 

    string xml; 

    using (StringWriter msw = new MyStringWriter()) 
    { 
     doc.Save(msw); 
     xml = msw.ToString(); 
    } 

    Console.WriteLine(xml); 

आउटपुट

<?xml version="1.0"?> 
<root>test</root>