XMLWriter ফাইলের পরিবর্তে একটি স্ট্রিংয়ে লিখতে হবে to


118

আমার কাছে একটি ডাব্লুসিএফ পরিষেবা রয়েছে যাতে এক্সএমএল এর স্ট্রিংটি ফেরত আসতে হবে। তবে মনে হয় লেখক কেবল একটি ফাইল তৈরি করতে চান, একটি স্ট্রিং নয়। আমি চেষ্টা করেছিলাম:

string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))

এটি নেক্সট এক্সএমস্ট্রিস্টিংয়ের কোনও ফাইল পাথ নেই বলে ত্রুটি উত্পন্ন করে। এটি এমন কিছু চায়:

using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))

আমি কীভাবে আমার এক্সএমএল তৈরি করব এবং তারপরে এটি স্ট্রিং হিসাবে ফিরিয়ে দেব ??

ধন্যবাদ !!

উত্তর:


217

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

XMLWriter.Create এর স্ট্রিং ওভারলোড ফাইলের নামের জন্য।

যেমন

using (var sw = new StringWriter()) {
  using (var xw = XmlWriter.Create(sw)) {
    // Build Xml with xw.


  }
  return sw.ToString();
}

2
@ উইল: আপনার পরিবর্তনটি রোলড XMLTextWriter. ক্লোজ () প্রবাহে প্রবাহিত হবে, সুতরাং স্ট্রিংটি বের করার আগে এমনটি ঘটতে চাই। (এই ক্ষেত্রে সামান্য পার্থক্য, তবে এটি ধারাবাহিকভাবে করা পছন্দ করুন কারণ * লেখক এবং স্ট্রিম ক্লাসের ফ্লাশ শব্দার্থবিজ্ঞান সবসময় পরিষ্কারভাবে নথিভুক্ত হয় না))
রিচার্ড

1
এটি ব্যবহার করা লোকের জন্য কেবল একটি মন্তব্য। যদি আপনি () ব্যবহার বাদ দিয়ে এর পরিবর্তে আপনার এক্সএমএল রাইটারটিকে সাধারণভাবে ঘোষণা করেন তবে আপনি ডাব্লু। টুস্ট্রিং () কল করার আগে xw.Flush কল করতে ভুলবেন না অন্যথায় আপনি সমস্ত সামগ্রী নাও পেতে পারেন! (স্পষ্টত ব্র্যাকেটগুলি ব্যবহার করা আরও ভাল ...)
রাভেন্ডার্কস্কি

মনে রাখবেন যে কোডগুলি বিশ্লেষণের সময় নিম্নলিখিত কোডটি CA2202 সতর্কতা দেয়, বিচুস ডিসপোজ () পদ্ধতিটি স্ট্রিং রাইটার অবজেক্টে দুবার ডাকা হবে
asukasz Kosiak

113

রিচার্ড যেমন বলেছিলেন, StringWriterএগিয়ে যাওয়ার পথ। একটি ছিনতাই আছে, তবে: ডিফল্টরূপে, StringWriterনিজেকে ইউটিএফ -16 এ হিসাবে প্রচার করবে। সাধারণত এক্সএমএল ইউটিএফ -8 এ থাকে। আপনি স্ট্রিং রাইটার সাবক্লাসিং করে এটি ঠিক করতে পারেন;

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}

এটি লিখিত ঘোষণাকে প্রভাবিত করবে XmlWriter। অবশ্যই, আপনি যদি পরে স্ট্রিংটি বাইনারি আকারে অন্য কোথাও লিখে থাকেন তবে নিশ্চিত হয়ে নিন যে আপনি কোনও এনকোডিং ব্যবহার করেছেন যা কোনও এনকোডিংয়ের সাথে মেলে যা আপনার জন্য ঠিক করে StringWriter। (উপরের কোডটি সর্বদা ইউটিএফ -8 ধরে থাকে; আরও সাধারণ সংস্করণ তৈরি করা তুচ্ছ যা কনস্ট্রাক্টরের একটি এনকোডিং গ্রহণ করে))

আপনি তখন ব্যবহার করতে চান:

using (TextWriter writer = new Utf8StringWriter())
{
    using (XmlWriter xmlWriter = XmlWriter.Create(writer))
    {
        ...
    }
    return writer.ToString();
}

জন, আপনি কি নিশ্চিত যে writerএকাধিকবার নিষ্পত্তি হচ্ছে না?
raxx

2
@ আরএক্স: এটি হতে পারে - তবে তাতে কিছু আসে যায় না।
জন স্কিটি

30

আমি জানি এটি পুরানো এবং উত্তর, তবে এটি করার আরও একটি উপায় এখানে। বিশেষত যদি আপনি আপনার স্ট্রিংয়ের শুরুতে UTF8 BOM না চান এবং আপনি পাঠ্যটি ইন্ডেন্টেড চান:

using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false)) 
                   { Formatting = Formatting.Indented })
{
     // ...
     return Encoding.UTF8.GetString(ms.ToArray());
}

3
Encoding.UTF8.GetString(ms.ToArray())আপনার ফিরে আসার সরলীকরণ।
স্লিভারনিঞ্জা - এমএসএফটি

1
ms.ToArray()আমি চেষ্টা করার পরে কোনও আইটেম ফেরত দেয় না। x.Close()স্টেটমেন্ট ব্যবহার করে অভ্যন্তরের ঠিক বাইরে রিটার্ন স্টেটমেন্ট যুক্ত বা সরানো হয়েছিল।
ধনী সি

Utf8.GetString (ms.GetBuffer (), 0, (int) ms.Length) করে; কাজ করে?
ব্রায়ানারি

1
@ রিচ সি - আমি সন্দেহ করি এটি হ'ল কারণ আপনার প্রবাহটি প্রবাহিত হয়নি। XMLTextWriter এর ব্যবহারের বিবৃতিটির বাইরে নিষ্পত্তি করা হত যা এটি প্রবাহিত করতে পারে।
yourbuddypal

13

ব্যবহার StringBuilder:

var sb = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(sb))
    {
        ...
    }
return sb.ToString();

1

ছেলেরা xMLWriter.Close () এবং xMLWriter.Dispose () কল করতে ভুলবেন না অথবা অন্যথায় আপনার স্ট্রিং তৈরি করা শেষ হবে না। এটি কেবল একটি খালি স্ট্রিং হবে


চিন্তা করবেন না, স্টেটমেন্ট ব্যবহার করে অবজেক্টের নিষ্পত্তি হবে।

এটি ২০০৯ সালের একটি প্রশ্ন So সুতরাং, এখনই একটি উত্তর সরবরাহ করার মান ভবিষ্যতের ব্যবহারকারীদের ক্ষেত্রে একই রকম সমস্যা থাকতে পারে। ফলস্বরূপ, পুরানো প্রশ্নের উত্তরগুলি কেবল তখনই সরবরাহ করা উচিত যখন তারা স্পষ্টভাবে সমস্যাটি সনাক্ত করতে পারে এবং কোনও সমাধানের ব্যাখ্যা / ব্যাখ্যা দিতে পারে। ওপিকে কথোপকথনে জড়িত করার চেষ্টা করা ফলদায়ক কারণ তারা সম্ভবত এগিয়ে চলেছে moved
মাইকিসি

আমি এই সমস্ত উদাহরণ দিয়ে যাচ্ছিলাম এবং অবাক হয়েছি কেন আমি খালি স্ট্রিং পাব। xmlWriter.Close()সমাধান ছিল।
রাফা রিস্কোস্কি

-1

ওয়েল আমি মনে করি এখানে সবচেয়ে সহজ এবং দ্রুত সমাধান কেবল এইভাবে হবে:

StringBuilder sb = new StringBuilder();

using (var writer = XmlWriter.Create(sb, settings))
{
    ... // Whatever code you have/need :)

    sb = sb.Replace("encoding=\"utf-16\"", "encoding=\"utf-8\""); //Or whatever uft you want/use.
    //Before you finally save it:
    File.WriteAllText("path\\dataName.xml", sb.ToString());
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.