xml - एक्सएमएल में अवैध अक्षर




illegal-characters (9)

Potame के जवाब के अलावा, यदि आप एक सीडीएटीए ब्लॉक का उपयोग करना बचाना चाहते हैं।

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

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

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

मैं फिलहाल कुछ एक्सएमएल के साथ काम कर रहा हूं।

मेरे पास नोड्स हैं जो स्ट्रिंग्स को नीचे की तरह रखते हैं:

<node>This is a string</node>

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

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

यह वैध के कारण मान्य नहीं है

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

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


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

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

उन सभी और साइन-इन का अनुवाद करने के लिए जो अनुमोदित नहीं हैं; उचित लोगों के लिए।

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


केवल अवैध वर्ण हैं, और < और > (साथ ही " या " गुणों में)।

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

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


जावा लोगों के लिए, अपाचे में एक यूटिलिटी क्लास (स्ट्रिंगएस्केप यूटिल्स) है जिसमें एक सहायक विधि escapeXml है जिसका उपयोग XML इकाइयों का उपयोग करके स्ट्रिंग में वर्णों से बचने के लिए किया जा सकता है।




वुडस्टॉक्स एक्सएमएल प्रोसेसर में, अमान्य वर्ण इस कोड द्वारा वर्गीकृत किए जाते हैं

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");

here से स्रोत


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

WebUtility.HtmlEncode(stringWithStrangeChars)

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;"




illegal-characters