XML में अमान्य वर्ण क्या हैं


229

मैं कुछ एक्सएमएल के साथ काम कर रहा हूं जो स्ट्रिंग्स रखते हैं जैसे:

<node>This is a string</node>

तार कि मैं नोड्स गुजर रहा से कुछ होगा पात्रों की तरह &, #, $, आदि .:

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

इस कारण मान्य नहीं है &

मैं इन स्ट्रिंग्स को सीडीएटीए में नहीं लपेट सकता क्योंकि उन्हें जैसा होना चाहिए, वैसा ही होना चाहिए। मैंने उन पात्रों की एक सूची की तलाश की, जो बिना सीडीएएटी के XML नोड्स में नहीं डाले जा सकते।

क्या कोई मुझे एक की दिशा में इंगित कर सकता है या मुझे अवैध पात्रों की सूची प्रदान कर सकता है?


4
CDATA का उपयोग न करने का कोई वैध कारण?
पीटर पेराह 14

1
हां, मैं स्ट्रिंग को सीएमएस को पास कर रहा हूं जिसे फतवीर कहा जाता है और डेटा के साथ नोड सीडीएटीए में नहीं हो सकता है, मुझे यकीन नहीं है कि यह तरीका क्यों है क्योंकि फतवीर काम करता है :(
रेल्सन

@Peter: मैं अपने मामले में CDATA का उपयोग कैसे कर सकता हूँ? stackoverflow.com/questions/6906705/…
Radek

जवाबों:


147

केवल अवैध चरित्र हैं &, <और >(साथ ही "या 'विशेषताओं में)।

वे XML संस्थाओं का उपयोग करके बच गए हैं , इस मामले में आप चाहते &amp;हैं &

वास्तव में, हालांकि, आपको एक टूल या लाइब्रेरी का उपयोग करना चाहिए जो आपके लिए XML लिखता है और आपके लिए इस तरह की चीज़ों को दूर करता है, इसलिए आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।


82
कुछ नियंत्रण वर्णों को भी अनुमति नहीं है। नीचे मेरा जवाब देखें।
dolmen

43
वास्तव में यह बिल्कुल सच नहीं है। निम्न असिसी वर्णों की संख्या भी अमान्य है। यदि आप Xx दस्तावेज़ में 0x03 लिखने का प्रयास करते हैं, तो आपको आम तौर पर एक त्रुटि मिलती है और यदि आप इसे XML दस्तावेज़ में ठीक से प्रबंधित करने का प्रबंधन करते हैं, तो अधिकांश दर्शक अमान्य चरित्र के बारे में शिकायत करेंगे। एज केस लेकिन ऐसा होता है।
रिक स्ट्राल

16
यह उत्तर बिलकुल गलत है। यहाँ 0x12 अवैध चरित्र 'System.Xml.XmlException:' 'के साथ मेरा XML अपवाद है, हेक्साडेसिमल मान 0x12, एक अमान्य चरित्र है'
जॉर्ज

8
यह दूसरी दिशा में भी गलत है; हर एक गैरकानूनी चरित्र को याद करने के साथ-साथ यह दावा करने वाले पात्र अवैध हैं, पूरी तरह से कानूनी हैं, संदर्भ में विशेष अर्थ के साथ।
जॉन हन्ना

6
XML 1.0 में कई अवैध चरित्र हैं। वास्तव में यहां तक ​​कि सबसे नियंत्रण पात्रों के लिए एक चरित्र इकाई का उपयोग करते समय पार्स करते समय एक त्रुटि होगी।
थायने

218

ठीक है, चलो वर्णों के प्रश्न को अलग करते हैं:

  1. किसी भी XML दस्तावेज़ में सभी मान्य नहीं हैं।
  2. भागने की जरूरत है।

@Dolmen द्वारा " XML में अमान्य वर्ण " के लिए दिया गया उत्तर अभी भी मान्य है लेकिन XML 1.1 विनिर्देश के साथ अद्यतन करने की आवश्यकता है।

1. अमान्य वर्ण

यहाँ वर्णित वर्ण वे सभी वर्ण हैं जिन्हें XML दस्तावेज़ में सम्मिलित करने की अनुमति है।

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) , xFFFE , xFFFF ...

हालांकि, नियंत्रण वर्ण और अपरिभाषित यूनिकोड चार का उपयोग हतोत्साहित किया जाता है।

यह भी देखा जा सकता है कि सभी पार्सर हमेशा इसे ध्यान में नहीं रखते हैं और नियंत्रण वर्ण वाले XML दस्तावेजों को अस्वीकार किया जा सकता है।

2. जिन चरित्रों को भागने की जरूरत है (एक अच्छी तरह से गठित दस्तावेज़ प्राप्त करने के लिए):

<एक के साथ भाग जाना चाहिए &lt;, इकाई के बाद से यह एक टैग की शुरुआत माना जाता है।

&एक के साथ भाग जाना चाहिए &amp;, इकाई के बाद से यह एक इकाई संदर्भ शुरुआत माना जाता है

>के साथ भाग जाना चाहिए &gt;इकाई। यह अनिवार्य नहीं है - यह संदर्भ पर निर्भर करता है - लेकिन इसे बचने के लिए दृढ़ता से सलाह दी जाती है।

'एक के साथ भाग जाना चाहिए &apos;इकाई - एकल उद्धरण में परिभाषित विशेषताओं में अनिवार्य है, लेकिन यह दृढ़ता से हमेशा यह से बचने के लिए सलाह दी जाती है।

"एक के साथ भाग जाना चाहिए &quot;इकाई - डबल कोट्स में परिभाषित विशेषताओं में अनिवार्य है, लेकिन यह दृढ़ता से हमेशा यह से बचने के लिए सलाह दी जाती है।


171

वैध वर्णों की सूची XML विनिर्देश में है :

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

7
आपको ध्यान देना चाहिए कि हालांकि वे कानूनी पात्र हैं, & < > " 'लेकिन कुछ संदर्भों में बचना होगा।
डी। शेवले

7
इस संदर्भ में "कानूनी" का अर्थ है कि उनके अंतिम डिकोड किए गए मूल्य कानूनी हैं, न कि वे धारा में कानूनी हैं। ऊपर के रूप में, कुछ कानूनी मूल्यों को इन-स्ट्रीम से बचना होगा।
सिल्वरबैकनेट

मेरे पास एक मुद्दा है जहां 0x1c एक अवैध चरित्र है ... जावा में एक संभावना की तलाश है कि इन से कैसे बचा जाए ....
basZero

एक अच्छा सिंहावलोकन जो वर्ण मान्य हैं और जो यहां पाए जाते हैं नहीं किया जा सकता है validchar.com/d/xml10/xml10_namestart
डॉ मैक्स Volkel

8
@xamde यह सूची अच्छी है, लेकिन यह केवल उन वर्णों को दिखाता है जिनका उपयोग XML तत्व को शुरू करने के लिए किया जा सकता है। हाथ में मुद्दा सामान्य रूप से XML फ़ाइल में कौन से वर्ण मान्य हैं। कुछ ऐसे पात्र हैं जिन्हें कहीं भी अनुमति नहीं है।
जॉन सेनचीना

59

यह XML अमान्य वर्णों को एक स्ट्रिंग से हटाने और एक नया वैध स्ट्रिंग वापस करने के लिए C # कोड है।

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
जावा के लिए, रेगेक्स पैटर्न समान होगा। और फिर आप क्लास स्ट्रिंग में रिप्लेसमेंट नामक विधि का उपयोग कर सकते हैं जो पैरामीटर के रूप में एक रेगेक्स पैटर्न की अपेक्षा करता है। इसे देखें: docs.oracle.com/javase/6/docs/api/java/lang/…
mathifonseca

2
मेरे स्ट्रिंग में ऐसे अमान्य वर्ण हैं: SUSITARIMO D & # x5; L DARBO SUTARTIES यह कोड नहीं हटाया गया और # x5; तो xml दस्तावेज़ init में विफल रहता है।
डेनिअस क्रेविस

मेरा मानना ​​है कि आप इस पैटर्न को एक .NET रेगेक्स कंस्ट्रक्टर में नहीं डाल सकते। मुझे नहीं लगता कि यह पहचानता है \u10000और \u10FFFFएकल पात्रों के रूप में उन्हें दो utf-16 charउदाहरणों की आवश्यकता होती है , और डॉक्स के अनुसार 4 अंक अधिक नहीं हो सकते हैं। [\u10000-\u10FFFF]सबसे अधिक संभावना के रूप में पार्स किया गया है [ \u1000, 0-\u10FF, F, F] जो अजीब लग रही है, लेकिन कानूनी है।
जीसर्ज


7

पोटैम के उत्तर के अलावा, यदि आप CDATA ब्लॉक का उपयोग करके बचना चाहते हैं।

यदि आप अपना पाठ सीडीएटीए ब्लॉक में रखते हैं तो आपको भागने से बचने की आवश्यकता नहीं है । उस स्थिति में आप निम्न श्रेणी के सभी वर्णों का उपयोग कर सकते हैं :

संभावित पात्रों का चित्रमय प्रतिनिधित्व

नोट: इसके शीर्ष पर, आपको ]]>वर्ण अनुक्रम का उपयोग करने की अनुमति नहीं है । क्योंकि यह CDATA ब्लॉक के अंत से मेल खाएगा।

यदि अभी भी अमान्य वर्ण (जैसे नियंत्रण वर्ण) हैं, तो संभवतः किसी प्रकार के एन्कोडिंग (जैसे बेस 64) का उपयोग करना बेहतर है।


3
सीडीएटीए ब्लॉक में वेदर या नहीं, एक्सएमएल में कुछ पात्रों को निषिद्ध किया गया है।
dolmen

4
वास्तव में, क्या मैंने ऐसा नहीं लिखा है? उद्धरण: " निम्न श्रेणी के सभी वर्ण "। जिससे मेरा मतलब है, इस विशिष्ट सीमा में केवल वर्ण। अन्य वर्णों को अनुमति नहीं है। - पूरी तरह से सहमत ; लेकिन मुझे समझ में नहीं आता है। - हालांकि कोई कठिन भावना नहीं।
bvdb

6

C # में संभावित अवांछित XML / XHTML वर्ण से बचने का एक और आसान तरीका है:

WebUtility.HtmlEncode(stringWithStrangeChars)

अमान्य वर्ण
डोलमेन

1
उन्होंने लिखा Xml नहीं Html।
इमानुएल

6

C # में गलत XML चार्ट हटाने का एक और तरीका है XmlConvert.IsXmlChar(.NET फ्रेमवर्क 4.0 के बाद से उपलब्ध)

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) XML के लिए मान्य नहीं है, यह मान्य UTF-8 है, लेकिन मान्य XML 1.0 नहीं है, और यहां तक ​​कि कई पुस्तकालय (libxml2 सहित) इसे याद करते हैं और चुपचाप अमान्य XML का उत्पादन करते हैं।


2

सारांश में, पाठ में मान्य वर्ण हैं:

  • टैब, लाइन-फीड और गाड़ी-वापसी।
  • सभी गैर-नियंत्रण वर्णों को छोड़कर & और मान्य हैं <
  • >अनुसरण करने पर मान्य नहीं है ]]

XML विनिर्देश के अनुभाग 2.2 और 2.4 विस्तार से उत्तर प्रदान करते हैं:

पात्र

कानूनी वर्ण टैब, कैरिज रिटर्न, लाइन फीड और यूनिकोड और आईएसओ / आईईसी 10646 के कानूनी पात्र हैं

चरित्र डेटा

एम्परसेंड वर्ण (और) और बाएं कोण कोष्ठक (<) को उनके शाब्दिक रूप में प्रकट नहीं होना चाहिए, सिवाय इसके जब मार्कअप सीमांकक के रूप में उपयोग किया जाता है, या एक टिप्पणी के भीतर, एक प्रसंस्करण निर्देश, या सीडीएटीए अनुभाग। यदि उन्हें कहीं और की जरूरत है, तो उन्हें क्रमशः संख्यात्मक चरित्र संदर्भों या "&" और "<" तार का उपयोग करके बच जाना चाहिए। समकोण कोष्ठक (>) को स्ट्रिंग ">" का उपयोग करके दर्शाया जा सकता है, और अनुकूलता के लिए, ">" या एक वर्ण संदर्भ का उपयोग करके बच जाना चाहिए जब यह स्ट्रिंग में दिखाई देता है "]]>" सामग्री में, जब कि स्ट्रिंग CDATA अनुभाग के अंत को चिह्नित नहीं कर रहा है।



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;

C # में, इन अवैध चरित्रों का उपयोग 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जिसका उपयोग XML संस्थाओं का उपयोग करके स्ट्रिंग में वर्णों से बचने के लिए किया जा सकता है।


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

XSL के लिए (वास्तव में आलसी दिनों पर) मैं उपयोग करता हूं:

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

सभी & -signs का अनुवाद करने के लिए जो poll amp follwed नहीं हैं; उचित लोगों के लिए।

हमारे पास ऐसे मामले हैं जहां इनपुट सीडीएटीए में है, लेकिन सिस्टम जो एक्सएमएल का उपयोग करता है, वह इसे ध्यान में नहीं रखता है। यह एक मैला है, सावधान रहना ...


8
यदि यह टेढ़ा है, तो क्या इसे यहाँ पोस्ट करना आवश्यक है?
dolmen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.