XmlDocument.Load失败,LoadXml工作:

时间:2011-09-21 09:16:38

标签: c# load xmldocument xmlexception

在回答this question时,我遇到了一个我不理解的情况。 OP试图从以下位置加载XML:http://www.google.com/ig/api?weather=12414&hl=it

显而易见的解决方案是:

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位。

似乎在à的{​​{1}}上窒息。

OTOH,以下工作正常:

Umidità

我对此感到困惑。任何人都可以解释为什么前者失败了,但后者工作正常吗?

值得注意的是,文档的xml声明省略了编码。

2 个答案:

答案 0 :(得分:12)

WebClient使用HTTP响应标头中的编码信息来确定正确的编码(在这种情况下ISO-8859-1是基于ASCII的,即每个字符8位)

看起来XmlDocument.Load不使用此信息,因为xml声明中也缺少编码,因此必须猜测编码并将其弄错。一些挖掘让我相信它选择了UTF-8。

如果我们想要真正获得技术,那么它所引发的字符是“à”,即ISO-8859-1编码中的0xE0,但这不是UTF-8中的有效字符 - 特别是该字符的二进制表示形式为:

11100000

如果您在UTF-8 Wikipedia article中进行了挖掘,我们可以看到这表示代码点(即字符)由总共3个字节组成,采用以下格式:

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

但如果我们回顾一下文档,接下来的两个字符是“:”,即ISO-8859-1中的0x3A和0x20。这意味着我们最终得到的是:

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

序列的第2个或第3个字节都没有10作为两个最高有效位(表示延续),所以这个字符在UTF-8中没有任何意义。

答案 1 :(得分:2)

Umidità字符串,因为Node innertext必须位于< ! [CDATA [Umidità]]>这不会在XmlDocument.Load中给出任何错误。