XDocument.ToString () XML एन्कोडिंग टैग ड्रॉप करता है


103

वहाँ किसी भी तरह से xml एन्कोडिंग () समारोह में एन्कोडिंग पाने के लिए है?

उदाहरण:

xml.Save("myfile.xml");

फलस्वरूप होता है

<?xml version="1.0" encoding="utf-8"?>
<Cooperations>
  <Cooperation>
    <CooperationId>xxx</CooperationId>
    <CooperationName>Allianz Konzern</CooperationName>
    <LogicalCustomers>

परंतु

tb_output.Text = xml.toString();

इस तरह एक आउटपुट की ओर जाता है

<Cooperations>
  <Cooperation>
    <CooperationId>xxx</CooperationId>
    <CooperationName>Allianz Konzern</CooperationName>
    <LogicalCustomers>
    ...

जवाबों:


98

या तो स्पष्ट रूप से घोषणा लिखें, या StringWriterकॉल और कॉल का उपयोग करें Save():

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

class Test
{
    static void Main()
    {
        string xml = @"<?xml version='1.0' encoding='utf-8'?>
<Cooperations>
  <Cooperation />
</Cooperations>";

        XDocument doc = XDocument.Parse(xml);
        StringBuilder builder = new StringBuilder();
        using (TextWriter writer = new StringWriter(builder))
        {
            doc.Save(writer);
        }
        Console.WriteLine(builder);
    }
}

आप आसानी से इसे विस्तार विधि के रूप में जोड़ सकते हैं:

public static string ToStringWithDeclaration(this XDocument doc)
{
    if (doc == null)
    {
        throw new ArgumentNullException("doc");
    }
    StringBuilder builder = new StringBuilder();
    using (TextWriter writer = new StringWriter(builder))
    {
        doc.Save(writer);
    }
    return builder.ToString();
}

यह लाभ है कि यह धमाका नहीं होगा अगर कोई घोषणा नहीं है :)

तो आप का उपयोग कर सकते हैं:

string x = doc.ToStringWithDeclaration();

ध्यान दें कि जो utf-16 को एन्कोडिंग के रूप में उपयोग करेगा, क्योंकि इसमें अंतर्निहित एन्कोडिंग है StringWriter। आप अपने आप को प्रभावित कर सकते हैं, हालांकि StringWriter, उप-वर्ग बनाकर , उदाहरण के लिए हमेशा यूटीएफ -8 का उपयोग करें


14
इसमें एक छोटा सा मुद्दा है कि XDocument घोषणा में एन्कोडिंग को अनदेखा कर दिया जाता है और बचत करते समय स्ट्रिंगराइटर की एन्कोडिंग द्वारा प्रतिस्थापित किया जाता है, जो कि आप क्या चाहते हैं या नहीं हो सकता है
सैम होल्डर

2
फिर आप विस्तार विधि को इसके साथ जोड़ते हैं: stackoverflow.com/a/1564727/75963 से Utf8StringWriter ;)
निक जोसव्स्की

12
ऊपर विस्तार विधि का उपयोग करना आसान पाया, लेकिन निम्नलिखित लौटाएं ... वापसी doc.Declaration + doc.ToString (); यदि घोषणा शून्य है, तो इसका परिणाम केवल रिक्त स्ट्रिंग में है।
स्टीव जी।

अजीब है, लेकिन मैं इसे अब काम नहीं कर सकता ( .net फिडेल ) - यह हमेशा "utf-16" एन्कोडिंग का उपयोग करता है। मैंने XDocument.Save(TextWriter)कार्यान्वयन के अंदर देखा है और यह घोषणा के एन्कोडिंग को अनदेखा करता है, जैसा कि XDocument.Save(String)या XDocument.Save(Stream)कार्यान्वयन के विपरीत है । मुझे आश्चर्य है कि क्यों ...
इल्या लुज़्यानिन

@IliLuzyanin: हाँ, यह "utf-16" का उपयोग एन्कोडिंग के रूप में करेगा जब आप एक में गुजरते हैं StringWriter, जब तक कि आप एक का उपयोग नहीं करते हैं जो Encodingसंपत्ति को ओवरराइड करता है। मुझे उस बारे में एक और जवाब मिल गया है। मुझे लगा कि आप कह रहे हैं कि यह "एन्कोडिंग" को पूरी तरह से
गिरा रहा है

46

घोषणा संपत्ति में एक्सएमएल घोषणा शामिल होगी। सामग्री प्लस घोषणा प्राप्त करने के लिए, आप निम्न कार्य कर सकते हैं:

tb_output.Text = xml.Declaration.ToString() + xml.ToString()

7
ऐसा लगता है कि यदि आप अपने xdocument में नए XDeclaration ("1.0", "utf-8", "yes") का उपयोग नहीं करते हैं, तो यह एक त्रुटि बनाता है क्योंकि xml.Declaration शून्य है। लेकिन xml.save सही एन्कोडिंग को स्वचालित करने के लिए लगता है।
हेनरिक पी। हेसल

या,tb_output.Text = @"<?xml version=""1.0"" encoding=""utf-8"" ?>" + xml;
बिल Hoag

4
या... = $"{xdoc.Declaration}{Environment.NewLine}{xdoc}";
वर्नरसीडी

9

इसे इस्तेमाल करो:

output.Text = String.Concat(xml.Declaration.ToString() , xml.ToString())

2
नया XDeclaration ("1.0", "utf-8", "Yes") बनाए बिना और XDocument या अन्य ऑब्जेक्ट में जोड़ने पर, xml.Declaration.ToString () एक शून्य अपवाद फेंक देगा।
जिगलर 19

1
यह नीचे की तरह सुरक्षित है क्योंकि Concat अशक्त तारों की परवाह नहीं करता है: output.Text = String.Concat (xml.Declaration, xml)
dmihailescu

3

मुझे यह पसंद आया

        string distributorInfo = string.Empty;

        XDocument distributors = new XDocument();

     //below is important else distributors.Declaration.ToString() throws null exception
        distributors.Declaration = new XDeclaration("1.0", "utf-8", "yes"); 

        XElement rootElement = new XElement("Distributors");
        XElement distributor = null;
        XAttribute id = null;

        distributor = new XElement("Distributor");
        id = new XAttribute("Id", "12345678");
        distributor.Add(id);
        rootElement.Add(distributor);

        distributor = new XElement("Distributor");
        id = new XAttribute("Id", "22222222");

        distributor.Add(id);

        rootElement.Add(distributor);         

        distributors.Add(rootElement);

        distributorInfo = String.Concat(distributors.Declaration.ToString(), distributors.ToString());

वितरकइन्फो में मुझे जो मिलता है, उसके लिए कृपया नीचे देखें

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Distributors>
  <Distributor Id="12345678" />
  <Distributor Id="22222222" />
  <Distributor Id="11111111" />
</Distributors>

1
अच्छा उदाहरण। कुछ नोट: 1) नए XDeclaration ("1.0", "utf-8", "Yes") के बजाय नए XDeclaration ("1.0", "utf-8") का उपयोग करें, 2) अंतिम पंक्ति में नई लाइन डालें: वितरक Declaration.ToString () + Environment.NewLine + distributors.ToString ()
एलेक्सी ओबुखोव

2

अन्य +1 उत्तरों के समान, लेकिन घोषणा के बारे में थोड़ा और विस्तार, और थोड़ा अधिक सटीक निष्कर्ष।

<xml />घोषणा फॉर्मेट किए गए XML में अपनी लाइन पर होनी चाहिए, इसलिए मैं यह सुनिश्चित कर रहा हूं कि हमारे पास नई लाइन जोड़ी जाए। नोट: इसका उपयोग करके Environment.Newlineयह प्लेटफ़ॉर्म विशिष्ट न्यूलाइन का उत्पादन करेगा

// Parse xml declaration menthod
XDocument document1 =
  XDocument.Parse(@"<?xml version=""1.0"" encoding=""iso-8859-1""?><rss version=""2.0""></rss>");
string result1 =
  document1.Declaration.ToString() +
  Environment.NewLine +
  document1.ToString() ;

// Declare xml declaration method
XDocument document2 = 
  XDocument.Parse(@"<rss version=""2.0""></rss>");
document2.Declaration =
  new XDeclaration("1.0", "iso-8859-1", null);
string result2 =
  document2.Declaration.ToString() +
  Environment.NewLine +
  document2.ToString() ;

दोनों परिणाम उत्पन्न:

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0"></rss>

1

इनमें से कुछ उत्तर पोस्टर के अनुरोध को हल करते हैं, लेकिन अत्यधिक जटिल लगते हैं। यहाँ एक सरल विस्तार विधि है जो एक अलग लेखक की आवश्यकता को टालती है, एक लापता घोषणा को संभालती है और मानक ToString SaveOptions पैरामीटर का समर्थन करती है।

public static string ToXmlString(this XDocument xdoc, SaveOptions options = SaveOptions.None)
{
    var newLine =  (options & SaveOptions.DisableFormatting) == SaveOptions.DisableFormatting ? "" : Environment.NewLine;
    return xdoc.Declaration == null ? xdoc.ToString(options) : xdoc.Declaration + newLine + xdoc.ToString(options);
}

एक्सटेंशन का उपयोग करने के लिए, बस के xml.ToString()साथ बदलेंxml.ToXmlString()


0

आप एक XmlWriter का उपयोग भी कर सकते हैं और कॉल कर सकते हैं

Writer.WriteDocType() 

तरीका।


0
string uploadCode = "UploadCode";
string LabName = "LabName";
XElement root = new XElement("TestLabs");
foreach (var item in returnList)
{  
       root.Add(new XElement("TestLab",
                new XElement(uploadCode, item.UploadCode),
                new XElement(LabName, item.LabName)
                            )
               );
}

XDocument returnXML = new XDocument(new XDeclaration("1.0", "UTF-8","yes"),
             root);

string returnVal;
using (var sw = new MemoryStream())
{
       using (var strw = new StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
       {
              returnXML.Save(strw);
              returnVal = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
       }
}

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