স্ট্রিং এক্সএমএলে প্রবেশ করুন


92

এমন কোনও সি # ফাংশন রয়েছে যা কোনও স্ট্রিংকে পালাতে এবং পালাতে ব্যবহৃত হতে পারে, যা কোনও এক্সএমএল উপাদানগুলির বিষয়বস্তু পূরণ করার জন্য ব্যবহার করা যেতে পারে?

আমি ভিএসটিএস ২০০৮ + সি # + নেট নেট using.০ ব্যবহার করছি।

সম্পাদনা 1: আমি সহজ এবং সংক্ষিপ্ত এক্সএমএল ফাইলটি সংক্ষেপে প্রকাশ করছি এবং আমি সিরিয়ালাইজেশন ব্যবহার করি না, সুতরাং আমাকে এক্সএমএল চরিত্রটি স্পষ্টভাবে হাতছাড়া করতে হবে, উদাহরণস্বরূপ, আমাকে এড়াতে a<bহবে <foo></foo>, সুতরাং আমার পালানোর স্ট্রিং দরকার a<bএবং এটিকে এলিমেন্ট ফোওয়ে রাখতে হবে।


নেই একটি একক ভাবে, কিন্তু এখানে কয়েকটি হল: http://weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape-an-XML-string-in-C .aspx
marcc

15
: সংক্ষিপ্ততম আমি মনে করতে পারেনnew XText(unescaped).ToString()
sehe

4
: অন্য কেউ এই উপর হুমড়ি জন্য, আমি এই সর্বোত্তম উত্তর হতে পাওয়া করেছি stackoverflow.com/a/5304827/1224069
ফিলিপ Pittle

উত্তর:


74
public static string XmlEscape(string unescaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerText = unescaped;
    return node.InnerXml;
}

public static string XmlUnescape(string escaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerXml = escaped;
    return node.InnerText;
}

4
এমনকি আপনাকে নথিতে উপাদান যুক্ত করতে হবে না। তবে, আমি এখনও বলব যে এটির জায়গায় প্রথমে চেষ্টা না করাই ভাল - মনে হচ্ছে জর্জ হাতের কাজ দিয়ে নিজের জন্য কাজ করছেন ...
জন স্কিইট

15
আমি এই উত্তরটি সত্যিই অপছন্দ করি কারণ এটি অত্যধিক ভারী। এক্সএমএল ডকুমেন্টটি আসল কাজটি করতে এক্সএমএলআরডার / এক্সএমএল রাইটার ব্যবহার করতে চলেছে, তবে তাড়া না করে কেন সেই ভারী ডিওএম এড়ানো যাবে না?
স্টিভেন সুদিত

7
@ উইল, ওপি একটি ফাংশন চেয়েছিল যা কোনও পাঠ্য থেকে রক্ষা পাবে যা কোনও এক্সএমএল উপাদান রাখতে পারে এবং বৈশিষ্ট্যটি নয়। আমার ফাংশনটি একক বা ডাবল উদ্ধৃতিগুলি এড়ায় না কারণ এগুলি এক্সএমএল উপাদানগুলিতে রাখা যেতে পারে।
দারিন দিমিত্রভ

4
@ ডারিন ভাল পয়েন্ট, এবং একটি যে চাপ দেওয়া উচিত। আমি এই কথোপকথনের ফলাফল নিয়ে সন্তুষ্ট এবং আমার সংরক্ষণগুলি প্রত্যাহার করে নিলাম। ভাল দিন স্যার.

4
আমি ভাবছি যদি HttpUtility.HtmlEncodeথেকে System.Webনিরাপদে ব্যবহার করা যায়?
পোভেন

127

9
এই উত্তরটি নির্বাচিত উত্তরের বিপরীতে উদ্ধৃতিগুলি থেকে রক্ষা পেয়েছে।

4
এই উত্তরটি invalid
হ্যাকড

16
আর আপনি কীভাবে পালাতে পারবেন?
গন্ডি

4
এই উত্তরটি অসম্পূর্ণ। এটি কেবল প্রশ্নের অর্ধেক উত্তর দেয়।
ব্রায়ান ওয়েবস্টার

4
উপরের মন্তব্যগুলির সাথে একমত - অসম্পূর্ণ এবং 100% সঠিক নয়।
জি স্টোনেভ

38

সম্পাদনা: আপনি বলেছিলেন "আমি সহজ এবং সংক্ষিপ্ত এক্সএমএল ফাইলকে সংবিধান দিচ্ছি এবং আমি সিরিয়ালাইজেশন ব্যবহার করি না, সুতরাং আমার হাত থেকে এক্সএমএল চরিত্রটি স্পষ্টভাবে পালাতে হবে"।

আমি আপনাকে দৃ strongly ়ভাবে পরামর্শ দিচ্ছি যে এটি হাতে হাতে না করা। আপনার জন্য এটি সব করার জন্য এক্সএমএল এপিআইগুলি ব্যবহার করুন - মূল ফাইলগুলিতে পড়ুন, দুটিকে একটি একক নথিতে মার্জ করুন তবে আপনার প্রয়োজন (আপনি সম্ভবত ব্যবহার করতে চান XmlDocument.ImportNode) এবং তারপরে এটি আবার লিখুন। আপনি নিজের এক্সএমএল পার্সার / ফর্ম্যাটর লিখতে চান না। ধারাবাহিকতা এখানে কিছুটা অপ্রাসঙ্গিক।

আপনি যদি যা করার চেষ্টা করছেন তার যদি আপনি আমাদের একটি সংক্ষিপ্ত তবে সম্পূর্ণ উদাহরণ দিতে পারেন তবে আমরা সম্ভবত আপনাকে প্রথম স্থানে পালানোর চিন্তাভাবনা এড়াতে সহায়তা করতে পারি।


আসল উত্তর

আপনি কী বোঝাতে চাইছেন তা সম্পূর্ণ পরিষ্কার নয়, তবে সাধারণত এক্সএমএল এপিআই আপনার জন্য এটি করে do আপনি পাঠ্যটি নোডে সেট করেছেন এবং এটি যা প্রয়োজন তা স্বয়ংক্রিয়ভাবে পালিয়ে যাবে। উদাহরণ স্বরূপ:

লিনকিউ থেকে এক্সএমএল উদাহরণ:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XElement element = new XElement("tag",
                                        "Brackets & stuff <>");

        Console.WriteLine(element);
    }
}

ডোম উদাহরণ:

using System;
using System.Xml;

class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        XmlElement element = doc.CreateElement("tag");
        element.InnerText = "Brackets & stuff <>";
        Console.WriteLine(element.OuterXml);
    }
}

উভয় উদাহরণ থেকে আউটপুট:

<tag>Brackets &amp; stuff &lt;&gt;</tag>

এটি ধরে নিচ্ছে আপনি অবশ্যই এক্সএমএলকে পালাতে চান। আপনি যদি না হন তবে দয়া করে আরও বিশদ পোস্ট করুন।


ধন্যবাদ জোন, আমি আমার মূল পোস্ট সম্পাদনা 1 বিভাগে আরও বিশদ রেখেছি। আপনি আমাকে কিছু মন্তব্য এবং পরামর্শ দিতে পারে যদি প্রশংসা। :-)
জর্জে 2

"এক্সএমএল পালানোর পরে" - আপনার মানে? আপনি কিছু অন্য কথায় বলতে পারেন দয়া করে? ইংরেজি আমার মাতৃভাষা নয়। :-)
জর্জে 2

হাই জোন, কীভাবে এক্সএমএল ফর্ম্যাট থেকে সাধারণ স্ট্রিং ফর্ম্যাটে আন-পলায়ন করা যায়, যেমন ইনপুট থেকে "বন্ধনী & amp; স্টাফ & lt; & gt;", আমরা আউটপুট "বন্ধনী এবং স্টাফ <>" পাই?
জর্জ 2

4
@ জর্জি 2: আপনি এর মানটির জন্য এক্সইলেট বা তার ইনটারেক্সট এর জন্য এক্সএমএলমেন্ট চাইবেন।
জন স্কিটি

26

এক লাইনের অব্যাহতির জন্য @ সিহিকে ধন্যবাদ:

var escaped = new System.Xml.Linq.XText(unescaped).ToString();

আমি এটিতে এক-লাইন আন-পলায়ন যুক্ত করব:

var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();

এক্সটেক্সট উদ্ধৃতিগুলি এড়ায় না।
Mert Gülsoy

9

জর্জ, এটা সহজ। এক্সএমএল হ্যান্ডল করতে সর্বদা এক্সএমএল এপিআই ব্যবহার করুন। তারা আপনার জন্য সমস্ত অব্যাহতি এবং আনসকেপিং করে।

স্ট্রিং যুক্ত করে কখনই এক্সএমএল তৈরি করবেন না।


কথার মধ্যে বেঁচে থাকা. অনেকগুলি এক্সএমএল এপিআই অপশন উপলব্ধ রয়েছে, তবে আমাদের সকলের পক্ষে একমত হওয়া উচিত হ'ল ম্যানুয়াল স্ট্রিং কনটেনটেশন গ্রহণযোগ্য নয়।
স্টিভেন সুদিত

আমি সাধারণত এটির সাথে একমত হওয়ার পরেও এমন কিছু খুব বিরল ঘটনা ঘটতে পারে যেখানে ম্যানুয়াল পলায়নের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, রোজলিন ব্যবহার করে এক্সএমএল ডকুমেন্টেশন তৈরি করার সময়।
এসভিক

@ এসভিক: লিনকু থেকে এক্সএমএল ব্যবহার করে কেন এক্সএমএল তৈরি করবেন না এবং তারপরে .TosString () ব্যবহার করবেন?
জন স্যান্ডার্স

@ জনসন্ডার্স, কারণ রোজলিনের নিজস্ব এক্সএমএল ক্লাস রয়েছে, যেমন XmlElementSyntax। এবং এটি ///আপনারও জেনারেট করা দরকার তা দ্বারা জটিল । এবং আমি প্রতিটি লাইন পৃথক হিসাবে উত্পন্ন করতে পারি না XObject, কারণ এটি মাল্টলাইন ট্যাগগুলির জন্য কাজ করবে না।
এসভিক

4
@ এসভিক: সুতরাং এক্সএমএল তৈরি করুন, সমস্তই এক লাইনে, তার ///সামনে আটকে দিন, তারপরে কোডটি পুনরায় ফর্ম্যাট করুন। একটি বিশাল বড় চুক্তি নয়, এবং অবশ্যই খুব একটা কোণার ক্ষেত্রে। যদি একেবারে প্রয়োজনীয় হয় তবে আমি নিশ্চিত যে XmlWriterআপনি নিজের পছন্দ মতো লাইন ব্রেক এবং হোয়াইটস্পেস করার একটি কাস্টম তৈরি করতে পারবেন তবে ///নতুন লাইনের সামনে রেখে । বিকল্পভাবে, এক্সএমএলকে সুন্দরভাবে মুদ্রণের জন্য একটি এক্সএসএলটি ব্যবহার করুন। তবে যে কোনও ক্ষেত্রে, এক্সএমএল এখনও একটি এক্সএমএল এপিআই দ্বারা উত্পন্ন করা উচিত।
জন স্যান্ডার্স

6

এবং যদি আপনি চান, আমার মতো যখন আমি এই প্রশ্নটি পেয়েছি, এক্সএমএল নোডের নামগুলি এড়াতে, উদাহরণস্বরূপ কোনও এক্সএমএল সিরিয়ালাইজেশন থেকে পড়ার সময়, সহজতম উপায়টি ব্যবহার করুন:

XmlConvert.EncodeName(string nameToEscape)

এটি এক্সএমএল উপাদানগুলির জন্য স্পেস এবং কোনও অ-বৈধ অক্ষরগুলি থেকেও রক্ষা পাবে।

http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx


আমি মনে করি, প্রশ্নের ভিত্তিতে তারা কেবল অভ্যন্তরীণ পাঠ্য চায়। আপনার সমাধানটি কাজ করবে, তবে কিছুটা ওভারকিল কারণ এটি উপাদান এবং বৈশিষ্ট্যর নামগুলির মতো জিনিসগুলিও পরিচালনা করতে পারে।
সান ডাগান

4
ভাল আমি এখানে নোডের নামগুলি থেকে বাঁচার চেষ্টা করেছি এবং ভেবেছিলাম যে আমার অনুসন্ধানগুলি ভবিষ্যতে কাউকে সহায়তা করতে পারে। আমি "ওভারকিল" কী তা দেখতে পাচ্ছি না তবে এটি ঠিক আছে। ;)
চার্লিবাউন

ওহ, এটি দরকারী তথ্য। :) আমি কেবল অনুভব করেছি যে আমি উল্লেখ করতে পারি যে আপনি সম্ভবত উত্তোলন না করতে পারেন তার একটি কারণ হ'ল লোকেরা মনে করতে পারে যে আপনি প্রশ্নের উত্তরটি হাতের কাছে দিচ্ছেন না।
শান দুগগান

লিঙ্কটি সিকিউরিটিএলিমেন্টের জন্য ডক্স নিয়ে যায় E এক্সএমএল কনভার্ট.এনকোডনাম (স্ট্রিং) এর নিজস্ব পৃষ্ঠা রয়েছে। আমি জানি এটি জিজ্ঞাসা করার কয়েক বছর হয়েছে, তবে কোনটি ব্যবহার করব তা আমি কীভাবে জানব? তারা কি একই কাজ না করে বিভিন্ন উপায়ে করে?
micnil

@ চর্লিবাউন: সম্ভবত আপনিও এ থেকে আলাদা প্রশ্ন তৈরি করতে এবং এর উত্তর দিতে চান, যাতে লোকেরা আরও ভালভাবে এটি জানতে পারে। এটি পোস্ট করার জন্য ধন্যবাদ!
ফ্লোরিয়ান স্ট্রাব

6

জন স্কিটির উত্তরের ভিত্তিতে আরেকটি গ্রহণ যা ট্যাগগুলি ফেরত দেয় না :

void Main()
{
    XmlString("Brackets & stuff <> and \"quotes\"").Dump();
}

public string XmlString(string text)
{
    return new XElement("t", text).LastNode.ToString();
} 

এটি এক্সএমএল এনকোডযুক্ত ফর্ম্যাটে কেবল পাস করা মানটি প্রত্যাবর্তন করে:

Brackets &amp; stuff &lt;&gt; and "quotes"

4

সতর্কতা: Necromancing

তবুও ডারিন দিমিত্রভের উত্তর + সিস্টেম.সিকিউরিটি.সিকিউরিটি এলিমেন্ট Eস্কেপ (স্ট্রিং) সম্পূর্ণ নয়।

এক্সএমএল ১.১ এ, সহজতম এবং নিরাপদতম উপায় হ'ল সমস্ত কিছুকে এনকোড করা। \ T এর জন্য
পছন্দ করুন &#09;
এটি XML 1.0 এ মোটেই সমর্থিত নয়।
এক্সএমএল 1.0 এর জন্য একটি সম্ভাব্য কাজটি হ'ল অক্ষর (অক্ষর) সহ টেক্সটকে বেস -64 এনকোড করা।

//string EncodedXml = SpecialXmlEscape("привет мир");
//Console.WriteLine(EncodedXml);
//string DecodedXml = XmlUnescape(EncodedXml);
//Console.WriteLine(DecodedXml);
public static string SpecialXmlEscape(string input)
{
    //string content = System.Xml.XmlConvert.EncodeName("\t");
    //string content = System.Security.SecurityElement.Escape("\t");
    //string strDelimiter = System.Web.HttpUtility.HtmlEncode("\t"); // XmlEscape("\t"); //XmlDecode("&#09;");
    //strDelimiter = XmlUnescape("&#59;");
    //Console.WriteLine(strDelimiter);
    //Console.WriteLine(string.Format("&#{0};", (int)';'));
    //Console.WriteLine(System.Text.Encoding.ASCII.HeaderName);
    //Console.WriteLine(System.Text.Encoding.UTF8.HeaderName);


    string strXmlText = "";

    if (string.IsNullOrEmpty(input))
        return input;


    System.Text.StringBuilder sb = new StringBuilder();

    for (int i = 0; i < input.Length; ++i)
    {
        sb.AppendFormat("&#{0};", (int)input[i]);
    }

    strXmlText = sb.ToString();
    sb.Clear();
    sb = null;

    return strXmlText;
} // End Function SpecialXmlEscape

এক্সএমএল 1.0:

public static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

সুতরাং এক্সএমএল 1.1 এ, আপনি কীভাবে সমস্ত কিছু এড়ান?
ফিলিপ পিটল

@ ফিলিপ পিটল: স্পেশালএক্সএমএলএইচসিপি দেখুন
স্টিফান স্টেইগার

3

নিম্নলিখিত ফাংশন কাজ করবে। এক্সএমএল ডকুমেন্টের বিরুদ্ধে পরীক্ষা করেনি, তবে আমার ধারণা এটি অনেক দ্রুত।

public static string XmlEncode(string value)
{
    System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings 
    {
        ConformanceLevel = System.Xml.ConformanceLevel.Fragment
    };

    StringBuilder builder = new StringBuilder();

    using (var writer = System.Xml.XmlWriter.Create(builder, settings))
    {
        writer.WriteString(value);
    }

    return builder.ToString();
}

public static string XmlDecode(string xmlEncodedValue)
{
    System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings
    {
        ConformanceLevel = System.Xml.ConformanceLevel.Fragment
    };

    using (var stringReader = new System.IO.StringReader(xmlEncodedValue))
    {
        using (var xmlReader = System.Xml.XmlReader.Create(stringReader, settings))
        {
            xmlReader.Read();
            return xmlReader.Value;
        }
    }
}

3

তৃতীয় পক্ষের লাইব্রেরি ( নিউটনসফট.জসন ) বিকল্প হিসাবে ব্যবহার করা:

public static string XmlEncode(string unescaped)
{
    if (unescaped == null) return null;
    return JsonConvert.SerializeObject(unescaped); ;
}

public static string XmlDecode(string escaped)
{
    if (escaped == null) return null;
    return JsonConvert.DeserializeObject(escaped, typeof(string)).ToString();
}

উদাহরণ:

a<b <==> "a&lt;b"

<foo></foo> <==> "foo&gt;&lt;/foo&gt;"

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