এক্সএমএলে অবৈধ অক্ষরগুলি কী


229

আমি এমন কিছু এক্সএমএল নিয়ে কাজ করছি যা এর মতো স্ট্রিং ধারণ করে:

<node>This is a string</node>

আমি নোডগুলিতে যাচ্ছি তার মধ্যে কয়েকটিতে এর মতো অক্ষর থাকবে &,# , $, ইত্যাদি .:

<node>This is a string & so is this</node>

এটি কারণে বৈধ নয় &

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

কেউ আমাকে একজনের দিকে নির্দেশ করতে পারে বা আমাকে অবৈধ চরিত্রের একটি তালিকা সরবরাহ করতে পারে?


4
সিডিএটিএ ব্যবহার না করার কোনও বৈধ কারণ?
পিটার পেরে

1
হ্যাঁ, আমি ফ্যাটওয়্যার নামক একটি সিএমএসে স্ট্রিংটি দিচ্ছি এবং ডেটা সহ নোডটি কোনও সিডিএটিএতে থাকতে পারে না, আমি নিশ্চিত নই যে এটি ফ্যাটওয়ায়ার যেভাবে কাজ করছে :(
রেলসন

@ পিটার: আমি কীভাবে আমার ক্ষেত্রে সিডিএটা ব্যবহার করতে পারি? stackoverflow.com/questions/6906705/…
রাডেক

উত্তর:


147

শুধুমাত্র অবৈধ অক্ষর &, <এবং >(সেইসাথে "বা 'গুণের)।

তারা ব্যবহার এস্কেপ করছি এক্সএমএল সত্ত্বা , এই ক্ষেত্রে আপনি চান &amp;জন্য &

সত্যই, যদিও আপনার এমন একটি সরঞ্জাম বা লাইব্রেরি ব্যবহার করা উচিত যা আপনার জন্য এক্সএমএল লিখে এবং এই ধরণের জিনিসটি আপনার জন্য দূরে সরিয়ে দেয় যাতে আপনাকে এটি নিয়ে চিন্তা করতে হবে না।


82
কিছু নিয়ন্ত্রণের অক্ষরও অনুমোদিত নয়। আমার উত্তর নীচে দেখুন।
ডলম্যান

43
আসলে এটি বেশ সত্য নয়। বেশ কয়েকটি নিম্নচরিত্রের অক্ষরও অবৈধ। আপনি যদি কোনও এক্সএমএল ডকুমেন্টে 0x03 লেখার চেষ্টা করেন তবে আপনি সাধারণত একটি ত্রুটি পান এবং আপনি যদি এটি XML নথিতে সঠিকভাবে এড়িয়ে চলতে পরিচালনা করেন তবে বেশিরভাগ দর্শক অবৈধ চরিত্র সম্পর্কে অভিযোগ করবেন। এজ কেস কিন্তু এটি ঘটে।
রিক স্ট্রহল

16
এই উত্তরটি একেবারেই ভুল। এখানে 0x12 অবৈধ চরিত্র 'সিস্টেম.XML.XMLException:' 'সহ আমার এক্সএমএল ব্যতিক্রম রয়েছে: হেক্সাডেসিমাল মান 0x12, একটি অবৈধ চরিত্র'
জর্জ

8
এটি অন্য দিকেও ভুল; পাশাপাশি প্রতিটি একক অবৈধ চরিত্র হারিয়ে যাওয়ার পাশাপাশি যে চরিত্রগুলি এটি অবৈধ দাবি করে তা পুরোপুরি আইনী, যদিও প্রসঙ্গে বিশেষ অর্থ রয়েছে।
জন হানা

6
এক্সএমএল 1.0 এ অনেক অবৈধ চরিত্র রয়েছে। প্রকৃতপক্ষে এমনকি বেশিরভাগ নিয়ন্ত্রণের অক্ষরের জন্য একটি অক্ষর সত্তা ব্যবহার করে পার্স করার সময় একটি ত্রুটি ঘটায়।
থায়নে

218

ঠিক আছে, আসুন যে চরিত্রগুলির প্রশ্নটি পৃথক করে:

  1. কোনও এক্সএমএল ডকুমেন্টে মোটেই বৈধ নয়।
  2. পালাতে হবে

" এক্সএমএলে অবৈধ অক্ষরগুলি কী কী " এ @ ডলম্যানের দেওয়া উত্তর এখনও বৈধ তবে এক্সএমএল ১.১ স্পেসিফিকেশন সহ আপডেট করা দরকার।

1. অবৈধ অক্ষর

এখানে বর্ণিত অক্ষরগুলি সমস্ত অক্ষর যা এক্সএমএল ডকুমেন্টে সন্নিবেশ করার অনুমতিপ্রাপ্ত।

1.1। এক্সএমএল 1.0 এ

অনুমোদিত অক্ষরের বৈশ্বিক তালিকাটি হ'ল:

[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

মূলত, ইউনিকোড ব্যাপ্তিগুলির বাইরে থাকা নিয়ন্ত্রণ অক্ষর এবং অক্ষরগুলিকে অনুমোদিত নয়। এর অর্থ হ'ল উদাহরণস্বরূপ চরিত্র সত্তা &#x3;নিষিদ্ধ।

1.2। এক্সএমএল 1.1 এ

অনুমোদিত অক্ষরের বৈশ্বিক তালিকাটি হ'ল:

[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]

এক্সএমএল সুপারিশের এই পুনর্বিবেচনা অনুমোদিত অক্ষরগুলিকে প্রসারিত করেছে যাতে নিয়ন্ত্রণের অক্ষর অনুমোদিত হয় এবং ইউনিকোড স্ট্যান্ডার্ডের একটি নতুন সংশোধনাকে বিবেচনা করে তবে এগুলি এখনও অনুমোদিত নয়: এন ইউ এল (x00) , এক্সএফএফএফই , এক্সএফএফএফএফ ...

তবে নিয়ন্ত্রণের অক্ষর এবং অপরিজ্ঞাত ইউনিকোড চর ব্যবহার করা নিরুৎসাহিত।

এটি লক্ষ্য করা যায় যে সমস্ত পার্সার সর্বদা এটি বিবেচনায় নেয় না এবং নিয়ন্ত্রণের অক্ষরযুক্ত এক্সএমএল নথিগুলি প্রত্যাখ্যান করা যেতে পারে।

২. যে চরিত্রগুলি পালাতে হবে (একটি সুগঠিত দলিল পেতে):

<একটি সঙ্গে পলান করা আবশ্যক &lt;, সত্তা যেহেতু এটি একটি ট্যাগ শুরুতে হতে অধিকৃত হয়।

&একটি সঙ্গে পলান করা আবশ্যক &amp;, সত্তা যেহেতু এটি একটি সত্তা রেফারেন্স শুরু গণ্য করা হয়

>সঙ্গে পলান করা উচিত &gt;সত্তা। এটি বাধ্যতামূলক নয় - এটি প্রসঙ্গে নির্ভর করে - তবে এটি থেকে পালানোর জন্য দৃ strongly়ভাবে পরামর্শ দেওয়া হচ্ছে।

'একটি সঙ্গে পলান করা উচিত &apos;সত্তা - একক উদ্ধৃতি মধ্যে সংজ্ঞায়িত বৈশিষ্ট্যাবলী বাধ্যতামূলক কিন্তু এটি জোরালোভাবে সবসময় এটা অব্যাহতি পরামর্শ দেওয়া হয়।

"একটি সঙ্গে পলান করা উচিত &quot;সত্তা - উদ্ধৃতি চিহ্ন মধ্যে সংজ্ঞায়িত বৈশিষ্ট্যাবলী বাধ্যতামূলক কিন্তু এটি জোরালোভাবে সবসময় এটা অব্যাহতি পরামর্শ দেওয়া হয়।


171

বৈধ অক্ষরের তালিকাটি এক্সএমএল স্পেসিফিকেশনে রয়েছে :

Char       ::=      #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]  /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

7
আপনার লক্ষ করা উচিত যে এগুলি আইনী চরিত্র হলেও & < > " 'নির্দিষ্ট প্রসঙ্গে পালাতে হবে।
ডি.শ্যাওলি

7
এই প্রসঙ্গে "আইনী" এর অর্থ হ'ল তাদের চূড়ান্ত ডিকোড করা মানগুলি বৈধ, না যে তারা প্রবাহে আইনী। উপরে হিসাবে, কিছু আইনী মূল্যবোধকে ইন-স্ট্রিম এড়িয়ে যেতে হবে।
সিলভারব্যাক

আমার একটা সমস্যা আছে যেখানে 0x1c একটি অবৈধ চরিত্র ... জাভাতে কীভাবে এড়াতে হবে তার সম্ভাবনার সন্ধান করছি ....
বাসজিরো

কোন অক্ষরগুলি বৈধ এবং কোনটি এখানে পাওয়া যাবে না তা একটি সুন্দর ওভারভিউ বৈধ / ডায়াল
ডাঃ ম্যাক্স ভেল্কেল

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

59

স্ট্রিং থেকে এক্সএমএল অবৈধ অক্ষরগুলি সরাতে এবং একটি নতুন বৈধ স্ট্রিং ফিরিয়ে দেওয়ার জন্য এটি একটি সি # কোড।

public static string CleanInvalidXmlChars(string text) 
{ 
    // From xml spec valid chars: 
    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]     
    // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. 
    string re = @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]"; 
    return Regex.Replace(text, re, ""); 
}

6
জাভার জন্য, রেজেক্স প্যাটার্নটি একই হবে। এবং তারপরে আপনি ক্লাস স্ট্রিংয়ে রিপ্লেসমেল নামক পদ্ধতিটি ব্যবহার করতে পারেন যা প্যারামিটার হিসাবে একটি রেজেক্স প্যাটার্ন আশা করে। এটি দেখুন: ডকস.ওরকল
//

2
আমার স্ট্রিংটিতে আমার এই জাতীয় অবৈধ অক্ষর রয়েছে: সুসিতারিমো ডি & # x5; এল ডার্বো সূত্র এই কোডটি & # x5 কে সরিয়ে দেয় না; সুতরাং এক্সএমএল ডকুমেন্টটি আরআইডি করতে ব্যর্থ।
ডেইনিয়াস ক্রেইভিস

আমি বিশ্বাস করি আপনি এই প্যাটার্নটি কেবল একটি নেট নেটজেক্স কনস্ট্রাক্টরে রাখতে পারবেন না। আমার মনে হয় না যে এটি স্বীকৃত \u10000এবং \u10FFFFএকক অক্ষর হিসাবে তাদের charপ্রতিটি দুটি utf-16 দৃষ্টান্ত প্রয়োজন , এবং ডক্সের মতে সেখানে 4 সংখ্যার বেশি নাও থাকতে পারে। [\u10000-\u10FFFF]সম্ভবত হিসাবে পার্স করা হয় [ \u1000, 0-\u10FF, F, F] যা অদ্ভুত খুঁজছেন কিন্তু বৈধ।
জিসার্গ


7

পোটামের উত্তর ছাড়াও, আপনি যদি সিডিএটিএ ব্লক ব্যবহার করে পালাতে চান।

আপনি যদি নিজের পাঠ্য কোনও সিডিএটিএ ব্লকে রেখে দেন তবে আপনাকে পলায়ন ব্যবহারের প্রয়োজন হবে নাসেক্ষেত্রে আপনি নিম্নলিখিত পরিসরে সমস্ত অক্ষর ব্যবহার করতে পারেন :

সম্ভাব্য অক্ষরের গ্রাফিকাল উপস্থাপনা

দ্রষ্টব্য: তার উপরে, আপনি ]]>অক্ষর ক্রম ব্যবহার করার অনুমতি পাচ্ছেন না । কারণ এটি সিডিএটিএ ব্লকের শেষের সাথে মিলবে।

যদি এখনও অবৈধ অক্ষর (যেমন নিয়ন্ত্রণের অক্ষর) থাকে তবে সম্ভবত কোনওরকম এনকোডিং ব্যবহার করা ভাল (যেমন বেস 64) 64


3
সিডিএটিএ ব্লকের চেয়ে বেশি কিছু না, এক্সএমএলে কিছু অক্ষর নিষিদ্ধ।
ডলমেন

4
ঠিক, আমি কি লিখেছি না? উক্তি: " নিম্নলিখিত সীমাতে সমস্ত অক্ষর "। যার অর্থ আমি এই নির্দিষ্ট পরিসরে কেবল অক্ষর। অন্যান্য অক্ষর অনুমোদিত নয়। - সম্পুর্ন একমত ; তবে আমি ডাউনটা জানি না। - কোন শক্ত অনুভূতি যদিও।
বিভিডিবি

6

সি # তে সম্ভাব্য অবাঞ্ছিত এক্সএমএল / এক্সএইচটিএমএল অক্ষরগুলি থেকে বাঁচার আরও একটি সহজ উপায় হ'ল:

WebUtility.HtmlEncode(stringWithStrangeChars)

অবৈধ অক্ষরগুলি
ডলম্যান

1
তিনি লিখেছিলেন এক্সএমএল নয় এইচটিএমএল।
ইমানুয়েল

6

সি # তে ভুল এক্সএমএল অক্ষর অপসারণের আরেকটি উপায় ব্যবহার করছে XmlConvert.IsXmlChar(। নেট ফ্রেমওয়ার্ক ৪.০ থেকে পাওয়া যায়)

public static string RemoveInvalidXmlChars(string content)
{
   return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray());
}

অথবা আপনি পরীক্ষা করতে পারেন যে সমস্ত অক্ষর XML- বৈধ:

public static bool CheckValidXmlChars(string content)
{
   return content.All(ch => System.Xml.XmlConvert.IsXmlChar(ch));
}

। নেট ফিডল

উদাহরণস্বরূপ, উল্লম্ব ট্যাব প্রতীক ( \v) এক্সএমএলের জন্য বৈধ নয়, এটি বৈধ ইউটিএফ -8, তবে বৈধ এক্সএমএল 1.0 নয়, এমনকি অনেকগুলি লাইব্রেরি (libxML2 সহ) এটি মিস করে এবং নিঃশব্দে অবৈধ এক্সএমএল আউটপুট দেয়।


2

সংক্ষেপে, পাঠ্যের মধ্যে বৈধ অক্ষরগুলি হ'ল:

  • ট্যাব, লাইন-ফিড এবং ক্যারেজ-রিটার্ন।
  • সমস্ত নিয়ন্ত্রণবিহীন অক্ষর ব্যতীত বৈধ & এবং <
  • >নিম্নলিখিত অনুসরণ করে বৈধ নয় ]]

এক্সএমএল স্পেসিফিকেশনের ২.২ এবং ২.৪ অনুচ্ছেদ বিস্তারিতভাবে উত্তর সরবরাহ করে:

চরিত্র

আইনি অক্ষরগুলি হ'ল ট্যাব, ক্যারেজ রিটার্ন, লাইন ফিড এবং ইউনিকোড এবং আইএসও / আইসিসি 10646 এর আইনী অক্ষর

চরিত্রের ডেটা

অ্যাম্পারস্যান্ড চরিত্র (&) এবং বাম কোণ ব্র্যাকেট (<) অবশ্যই তাদের আক্ষরিক আকারে উপস্থিত না হওয়া ছাড়া, মার্কআপ ডেলিমিটার হিসাবে ব্যবহার করা ছাড়া, বা কোনও মন্তব্যে, প্রসেসিং নির্দেশিকা বা সিডিএটিএ বিভাগে থাকা উচিত। যদি এগুলি অন্য কোথাও প্রয়োজন হয় তবে তাদের অবশ্যই যথাক্রমে সংখ্যার চরিত্রের রেফারেন্স বা স্ট্রিং "&" এবং "<" ব্যবহার করে পালাতে হবে। ডান কোণ ব্র্যাকেট (>) স্ট্রিং ">" ব্যবহার করে উপস্থাপিত হতে পারে এবং সামঞ্জস্যের জন্য অবশ্যই ">" বা একটি অক্ষর রেফারেন্স যখন বিষয়বস্তুতে স্ট্রিং "]]>" এ প্রদর্শিত হবে তখন তা ব্যবহার করে পালাতে হবে স্ট্রিং একটি সিডিএটিএ বিভাগের শেষ চিহ্নিত করছে না।



1
ampersand (&) is escaped to &amp;

double quotes (") are escaped to &quot;

single quotes (') are escaped to &apos; 

less than (<) is escaped to &lt; 

greater than (>) is escaped to &gt;

সি # তে, এই অবৈধ অক্ষরগুলি ব্যবহার করতে System.Security.SecurityElement.Escapeবা System.Net.WebUtility.HtmlEncodeএড়াতে ব্যবহার করুন ।

string xml = "<node>it's my \"node\" & i like it 0x12 x09 x0A  0x09 0x0A <node>";
string encodedXml1 = System.Security.SecurityElement.Escape(xml);
string encodedXml2= System.Net.WebUtility.HtmlEncode(xml);


encodedXml1
"&lt;node&gt;it&apos;s my &quot;node&quot; &amp; i like it 0x12 x09 x0A  0x09 0x0A &lt;node&gt;"

encodedXml2
"&lt;node&gt;it&#39;s my &quot;node&quot; &amp; i like it 0x12 x09 x0A  0x09 0x0A &lt;node&gt;"

1

জাভা ভাবেনদের জন্য, অ্যাপাচে একটি ইউটিলিটি ক্লাস ( StringEscapeUtils) রয়েছে যার একটি সহায়ক পদ্ধতি রয়েছে escapeXmlযা এক্সএমএল সত্ত্বাগুলি ব্যবহার করে স্ট্রিংয়ের অক্ষরগুলি পালানোর জন্য ব্যবহার করা যেতে পারে।


1

উডস্টক্স এক্সএমএল প্রসেসরে, অবৈধ অক্ষরগুলি এই কোড দ্বারা শ্রেণিবদ্ধ করা হয়:

if (c == 0) {
    throw new IOException("Invalid null character in text to output");
}
if (c < ' ' || (c >= 0x7F && c <= 0x9F)) {
    String msg = "Invalid white space character (0x" + Integer.toHexString(c) + ") in text to output";
    if (mXml11) {
        msg += " (can only be output using character entity)";
    }
    throw new IOException(msg);
}
if (c > 0x10FFFF) {
    throw new IOException("Illegal unicode character point (0x" + Integer.toHexString(c) + ") to output; max is 0x10FFFF as per RFC");
}
/*
 * Surrogate pair in non-quotable (not text or attribute value) content, and non-unicode encoding (ISO-8859-x,
 * Ascii)?
 */
if (c >= SURR1_FIRST && c <= SURR2_LAST) {
    throw new IOException("Illegal surrogate pair -- can only be output via character entities, which are not allowed in this content");
}
throw new IOException("Invalid XML character (0x"+Integer.toHexString(c)+") in text to output");

এখান থেকে উত্স


-1

কেউ কি এই চেষ্টা করে System.Security.SecurityElement.Escape(yourstring)? এটি বৈধ সমতুল্যের সাথে একটি স্ট্রিংয়ে অবৈধ XML অক্ষরকে প্রতিস্থাপন করবে।


-5

এক্সএসএলের জন্য (সত্যিই অলস দিনগুলিতে) আমি ব্যবহার করি:

capture="&amp;(?!amp;)" capturereplace="&amp;amp;"

যে সমস্ত & সাইনগুলি ফলপ্রসূ হয়নি তা অনুবাদ করতে; সঠিক বেশী।

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


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