2011-09-21 20 views
8

this question का जवाब देने में, मैं ऐसी परिस्थिति में आया जो मुझे समझ में नहीं आया। ओपी निम्न स्थान से एक्सएमएल लोड करने के लिए कोशिश कर रहा था: http://www.google.com/ig/api?weather=12414&hl=itXmlDocument.Load विफल रहता है, लोडएक्सएमएल काम करता है:

स्पष्ट समाधान है:

string m_strFilePath = "http://www.google.com/ig/api?weather=12414&hl=it"; 
XmlDocument myXmlDocument = new XmlDocument(); 
myXmlDocument.Load(m_strFilePath); //Load NOT LoadXml 

हालांकि इस के साथ

XmlException विफल रहता है: दिया एन्कोडिंग में अमान्य वर्ण। लाइन 1, स्थिति 499.

यह Umidità की à पर घुट रहा है।

OTOH, निम्न कार्य करता ठीक:

var m_strFilePath = "http://www.google.com/ig/api?weather=12414&hl=it"; 
string xmlStr; 
using(var wc = new WebClient()) 
{ 
    xmlStr = wc.DownloadString(m_strFilePath); 
} 
var xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xmlStr); 

मैं इस से विस्मित कर रहा हूँ। क्या कोई समझा सकता है कि पूर्व क्यों विफल रहता है, लेकिन बाद वाला ठीक काम करता है?

विशेष रूप से, दस्तावेज़ की एक्सएमएल घोषणा एक एन्कोडिंग को छोड़ देती है।

+0

क्या यह संभव है कि वेब क्लाइंट HTMLencodes? – Nicolai

उत्तर

12

WebClient HTTP प्रतिक्रिया के हेडर में एन्कोडिंग जानकारी का उपयोग करता सही एन्कोडिंग निर्धारित करने के लिए (इस मामले ISO-8859-1 जो ASCII आधारित है, यानी 8 वर्ण प्रति बिट्स)

यह XmlDocument.Load तरह लग रहा है का उपयोग नहीं करता यह जानकारी और एक्सएमएल घोषणा से एन्कोडिंग भी गायब है, इसे एन्कोडिंग पर अनुमान लगाना है और इसे गलत लगता है। कुछ खोदने से मुझे विश्वास होता है कि यह यूटीएफ -8 चुनता है।

यदि हम वास्तव में तकनीकी प्राप्त करना चाहते हैं तो यह चरित्र "ए" पर फेंकता है, जो आईएसओ -885 9 -1 एन्कोडिंग में 0xE0 है, लेकिन यह UTF-8 में मान्य वर्ण नहीं है - विशेष रूप से बाइनरी प्रस्तुति इस चरित्र है:

11100000 

आप के चारों ओर एक खुदाई है, तो UTF-8 Wikipedia article में हम देख सकते हैं कि यह एक कोड बिंदु (यानी चरित्र) 3 बाइट्स कि निम्न स्वरूप ले की कुल से मिलकर इंगित करता है:

Byte 1  Byte 2  Byte 3 
----------- ----------- ----------- 
1110xxxx 10xxxxxx 10xxxxxx 

लेकिन अगर हमारे पास दस्तावेज़ पर वापस देखें अगले दो अक्षर ":" हैं जो आईएसओ -885 9 -1 में 0x3A और 0x20 है। इसका मतलब यह है कि क्या हम वास्तव में अंत के साथ है:

Byte 1  Byte 2  Byte 3 
----------- ----------- ----------- 
11100000 00111010 00100000 

न तो अनुक्रम के 2 या 3 बाइट्स दो सबसे महत्वपूर्ण बिट के रूप में 10 (जो एक निरंतरता का संकेत होगा) है, और इसलिए इस चरित्र में कोई मतलब नहीं है UTF-8।

+0

अब रिफ्लेक्टर खोलना ... – spender

+0

कोड में देखकर, ऐसा लगता है कि लोड एक 'XmlTextReader' को तुरंत चालू करता है लेकिन एन्कोडिंग सेट करने का प्रयास नहीं करता है। – spender

+0

@ स्पेंडर हाँ, मैंने आईएलएसपी के अंदर एक नज़र डाली थी, लेकिन यह देखना मुश्किल था कि क्या चल रहा था - दिलचस्प सवाल हालांकि, मुझे इसका जवाब देने में खुशी हुई!:-) – Justin

2

नोड इनरटेक्स्ट के रूप में Umidità स्ट्रिंग < के अंदर होना चाहिए! [सीडीएटीए [Umidità]]> यह XmlDocument.Load में कोई त्रुटि नहीं देगा।

+0

यह प्रश्न XML को ठीक करने के तरीके के बारे में नहीं है, लेकिन ऊपर दिए गए प्रश्न में उल्लिखित दो विधियों के बीच व्यवहार अलग क्यों है। – spender

+1

असल में सीडीएटीए टैग पार्सर को वर्ण डेटा इंगित करते हैं ताकि एक्सएमएल संरचनाएं (जैसे "<") से बचने की आवश्यकता न हो, लेकिन इस मामले में इसकी एन्कोडिंग समस्या - सीडीएटीए टैग का उपयोग करने से कोई फर्क नहीं पड़ता। – Justin

संबंधित मुद्दे