XDocament.ToString () XML এনকোডিং ট্যাগটি ড্রপ করে


103

টসস্ট্রিং () ফাংশনে এক্সএমএল এনকোডিং পাওয়ার কোনও উপায় আছে কি?

উদাহরণ:

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
এতে একটি ছোট সমস্যা আছে যে এক্স ডকুমেন্ট ঘোষণায় এনকোডিং উপেক্ষা করা হয় এবং সেভ করার সময় স্ট্রিং রাইটারের এনকোডিং দ্বারা প্রতিস্থাপন করা হয়, যা আপনি চান বা নাও করতে পারেন
স্যাম হোল্ডার

2
থেকে Utf8StringWriter তারপর আপনার সাথে এক্সটেনশন পদ্ধতি একত্রিত stackoverflow.com/a/1564727/75963 );
নিক Josevski

12
উপরে এক্সটেনশান পদ্ধতিটি ব্যবহার করা সহজ কিন্তু নিম্নলিখিতটি ফিরে আসুন ... ডক্টর ডিক্লেয়ারেশন + ডক্টর.টোলস্ট্রিং () ফিরিয়ে দিন; যদি ঘোষণাটি বাতিল হয় তবে এটি কেবল একটি খালি স্ট্রিংয়ের ফলাফল।
স্টিভ জি

অদ্ভুত, তবে আমি এখন এটি কাজ করতে পারি না (। নেট ফিডাল ) - এটি সর্বদা "utf-16" এনকোডিং ব্যবহার করে। আমি XDocument.Save(TextWriter)বাস্তবায়নের অভ্যন্তর দেখেছি এবং এটি ঘোষণার এনকোডিংটিকে, যেমন বিরোধী XDocument.Save(String)বা XDocument.Save(Stream)বাস্তবায়ন হিসাবে তা উপেক্ষা করে । আমি ভাবছি কেন ...
Ilya Luzyanin

@ ইলিয়া লুজিয়ানিন: হ্যাঁ, আপনি যখন পাস করবেন তখন এটি এনকোডিং হিসাবে "utf-16" ব্যবহার করবে StringWriter, যদি না আপনি Encodingসম্পত্তিটিকে ওভাররাইড করে এমন কোনও ব্যবহার করেন । আমি সে সম্পর্কে আরও একটি উত্তর পেয়েছি। আমি ভেবেছিলাম আপনি বলছেন এটি পুরোপুরি "এনকোডিং" বাদ
দিচ্ছে

46

ঘোষণার সম্পত্তিটিতে এক্সএমএল ঘোষণা থাকবে। বিষয়বস্তু প্লাস ঘোষণা পেতে, আপনি নিম্নলিখিতটি করতে পারেন:

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

7
দেখে মনে হচ্ছে আপনি যদি আপনার এক্সডোকামেন্টে নতুন এক্সডিক্লারেশন ("1.0", "utf-8", "হ্যাঁ") ব্যবহার না করেন এটি একটি ত্রুটি তৈরি করে কারণ xml. ডিক্লেয়ারেশন বাতিল is তবে xML.save ডান এনকোডিংটি স্বয়ংক্রিয়ভাবে আবিষ্কার করেছে বলে মনে হচ্ছে।
হেনরিক পি। হেসেল

বা,tb_output.Text = @"<?xml version=""1.0"" encoding=""utf-8"" ?>" + xml;
বিল হোয়াগ

4
বা... = $"{xdoc.Declaration}{Environment.NewLine}{xdoc}";
ওয়ার্নারসিডি

9

এটা ব্যবহার কর:

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

2
নতুন এক্সডিক্লারেশন ("1.0", "utf-8", "হ্যাঁ") তৈরি না করে এবং এক্সডোকামেন্ট বা অন্যান্য বস্তুর সাথে যুক্ত করা, xml.Declaration.ToString () একটি নাল ব্যতিক্রম ছুঁড়ে ফেলবে।
জিগ্লার

1
এটি নীচের মতো নিরাপদ কারণ কনক্যাট নাল স্ট্রিংগুলির বিষয়ে চিন্তা করে না: আউটপুট.টেক্সট = স্ট্রিং C কনক্যাট (এক্সএমএল। ডিক্লেয়ারেশন, এক্সএমএল)
ডিমিহাইলস্কু

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) নতুন এক্সডিক্লারেশন ("1.0", "utf-8", "হ্যাঁ") এর পরিবর্তে নতুন এক্সডেক্লারেশন ("1.0", "utf-8") ব্যবহার করুন, 2) শেষ লাইনে নতুন লাইন প্রবেশ করুন: পরিবেশকগণ। ঘোষণাপত্র.টোস্ট্রিং () + পরিবেশনা.নিউলাইন + ডিস্ট্রিবিউটর।
টুস্ট্রিং

2

অন্যান্য +1 জবাবগুলির মতো, তবে ঘোষণাপত্রের বিষয়ে আরও কিছু বিশদ, এবং আরও কিছুটা সঠিক কনকেন্টেশন।

<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

এর মধ্যে কয়েকটি উত্তর পোস্টারের অনুরোধটি সমাধান করে তবে অতিরিক্ত জটিল বলে মনে হয়। এখানে একটি সহজ এক্সটেনশন পদ্ধতি যা পৃথক লেখকের প্রয়োজন এড়িয়ে যায়, একটি অনুপস্থিত ঘোষণাকে পরিচালনা করে এবং স্ট্যান্ডার্ড টোস্ট্রিং সেভঅপশন প্যারামিটার সমর্থন করে।

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

আপনি একটি এক্সএমএল রাইটার ব্যবহার করতে পারেন এবং কল করতে পারেন

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.