2009-10-29 16 views
6

का उपयोग कर एक्सएमएल में वर्जित वर्णों से निपटना मेरे पास एक ऑब्जेक्ट है जो मैं xml को क्रमबद्ध कर रहा हूं। ऐसा प्रतीत होता है कि गुणों में से किसी एक मान में हेक्स वर्ण 0x1E होता है। मैंने XmlWriterSettings की एन्कोडिंग प्रॉपर्टी को "utf-16" और "यूनिकोड" दोनों में सेट करने का प्रयास किया है, लेकिन मुझे अभी भी एक अपवाद फेंक दिया गया है:सी # .NET

यहां XML दस्तावेज़ उत्पन्न करने में त्रुटि हुई थी। ---> System.InvalidOperationException: XML दस्तावेज़ उत्पन्न करने में त्रुटि हुई थी। ---> सिस्टम। ऑर्ग्यूमेंट अपवाद: '', हेक्साडेसिमल मान 0x1E, एक अवैध चरित्र है।

क्या इन वर्णों को xml में लाने का कोई तरीका है? यदि नहीं, तो क्या ऐसे अन्य पात्र हैं जो समस्याएं पैदा करेंगे?

+0

कृपया कुछ कोड दिखाएं जो समस्या को पुन: उत्पन्न करता है। जब हम नहीं जानते कि समस्या का कारण बनने के लिए आप क्या कर रहे हैं तो हम आपकी मदद कैसे कर सकते हैं? –

उत्तर

2

आप तब से बच सकते हैं जैसे आप HTML के लिए करेंगे। 0x1E दशमलव 30 के समान है इसलिए स्ट्रिंग के साथ अपने रिकॉर्ड विभाजक चरित्र को प्रतिस्थापित करें, "& 30;" और यह ठीक होना चाहिए।

+0

अरे ... मैंने इसका उपयोग करने की कोशिश की लेकिन ब्राउज़र और एक्सएमएल पाठक अभी भी इसे एक अवैध चरित्र के रूप में दोबारा पोस्ट करते हैं। उदाहरण के लिए, यह एक्सएमएल अमान्य है: ' बीबीबी  सीसीसी' –

7

एक्सएमएल सिफ़ारिश (उर्फ कल्पना) http://www.w3.org/TR/2000/REC-xml-20001006 रूपरेखा जो अक्षर स्वीकृत नहीं है और


2,2 वर्ण

[परिभाषा भाग निकले किया जाना चाहिए: एक पार्स इकाई पाठ, वर्णों का एक क्रम होता है, जो हो सकता है मार्कअप या चरित्र डेटा का प्रतिनिधित्व करें।] [परिभाषा: एक चरित्र आईएसओ/आईईसी 10646 [आईएसओ/आईईसी 10646] द्वारा निर्दिष्ट पाठ की परमाणु इकाई है (यह भी देखें [आईएसओ/आईईसी 10646-2000])। कानूनी पात्र टैब, कैरिज रिटर्न, लाइन फीड, और यूनिकोड और आईएसओ/आईईसी 10646 के कानूनी पात्र हैं। इस दस्तावेज तैयार होने के समय ए .1 सामान्य संदर्भों में उल्लिखित इन मानकों के संस्करण वर्तमान थे। संशोधनों या नए संस्करणों द्वारा इन मानकों में नए वर्ण जोड़े जा सकते हैं। नतीजतन, एक्सएमएल प्रोसेसर को चार के लिए निर्दिष्ट सीमा में किसी भी चरित्र को स्वीकार करना होगा। "संगतता वर्ण" का उपयोग, के रूप में [यूनिकोड] की धारा 6.8 में परिभाषित है, हतोत्साहित किया जाता है (यह भी D21 [Unicode3] की धारा 3.6 में देखें)।]

चरित्र रेंज

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

तंत्र के लिए बिट पैटर्न में एन्कोडिंग वर्ण कोड बिंदु इकाई से इकाई में भिन्न हो सकते हैं। सभी एक्सएमएल प्रोसेसर को 10646 के यूटीएफ -8 और यूटीएफ -16 एन्कोडिंग को स्वीकार करना होगा; सिग्नलिंग के लिए तंत्र उपयोग में है, या अन्य एन्कोडिंग को खेलने में लाने के लिए, बाद में चर्चा की जाती है, 4.3.3 में एंटिटीज में कैरेक्टर एन्कोडिंग।


1

एक्सएमएल मानव-पठनीय प्रारूप है और गैर-प्रिंट करने योग्य नियंत्रण वर्ण वर्जित हैं। आप दशमलव वर्ण इकाई कोड जैसे & # 30 का उपयोग कर सकते हैं; उनका प्रतिनिधित्व करने के लिए, या बेस -64 सामग्री को एन्कोड करें।

1

चूंकि आपने कोई विवरण नहीं दिया है, इसलिए मुझे लगता है कि आपकी संपत्ति System.String प्रकार है। यदि ऐसा है, तो आप इसे समान रूप से क्रमबद्ध नहीं कर सकते हैं। इसके बजाय, आप इसे एक बाइट [] के रूप में क्रमानुसार चाहिए:

[XmlRoot("root")] 
public class HasBase64Content 
{ 
    [XmlIgnore] 
    public string Content { get; set; } 

    [XmlElement("Content")] 
    public byte[] Base64Content 
    { 
     get 
     { 
      return System.Text.Encoding.UTF8.GetBytes(Content); 
     } 
     set 
     { 
      if (value == null) 
      { 
       Content = null; 
       return; 
      } 

      Content = System.Text.Encoding.UTF8.GetString(value); 
     } 
    } 
} 
2

मुझे पता है यह एक पुराने सवाल है, लेकिन मैं एक कड़ी और iam इसे यहाँ पोस्ट कर पाया है, यह जो इस सवाल के पार आने के लिए उपयोगी होगा। यह मेरे लिए काम किया।

http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/

और उस साइट से कोड।अपने डेटा को यूनिकोड Control Picture ब्लॉक से वर्ण, आप अक्रमांकन पर क्रमबद्धता पर नियंत्रण वर्ण के लिए उन्हें प्रतिस्थापन और फिर से वापस द्वारा मानव पठनीयता बनाए रख सकते हैं अनुमति नहीं देता है

/// <summary> 
/// Remove illegal XML characters from a string. 
/// </summary> 
public string SanitizeXmlString(string xml) 
{ 
if (xml == null) 
{ 
    throw new ArgumentNullException("xml"); 
} 

StringBuilder buffer = new StringBuilder(xml.Length); 

foreach (char c in xml) 
{ 
    if (IsLegalXmlChar(c)) 
    { 
     buffer.Append(c); 
    } 
} 

return buffer.ToString(); 
} 

/// <summary> 
/// Whether a given character is allowed by XML 1.0. 
/// </summary> 
public bool IsLegalXmlChar(int character) 
{ 
return 
(
    character == 0x9 /* == '\t' == 9 */   || 
    character == 0xA /* == '\n' == 10 */   || 
    character == 0xD /* == '\r' == 13 */   || 
    (character >= 0x20 && character <= 0xD7FF ) || 
    (character >= 0xE000 && character <= 0xFFFD ) || 
    (character >= 0x10000 && character <= 0x10FFFF) 
); 
} 
1

(मामले में साइट नीचे चला जाता है तो)।

␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏

␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟

:

नीचे चरित्र

␠ ␡

उम्मीद है कि वे आपके ब्राउज़र और संपादकों में प्रस्तुत करते हैं। भले ही वे नहीं करते हैं, वे एक्सएमएल में कानूनी हैं।