spe*_*der 8 c# xmldocument load xmlexception
在回答这个问题时,我遇到了一个我不理解的情况.OP正在尝试从以下位置加载XML:http://www.google.com/ig/api?weather = 12414&hl =
明显的解决方案是:
string m_strFilePath = "http://www.google.com/ig/api?weather=12414&hl=it";
XmlDocument myXmlDocument = new XmlDocument();
myXmlDocument.Load(m_strFilePath); //Load NOT LoadXml
Run Code Online (Sandbox Code Playgroud)
然而,这失败了
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);
Run Code Online (Sandbox Code Playgroud)
我为此感到困惑.任何人都可以解释为什么前者失败,但后者工作正常吗?
值得注意的是,文档的xml声明省略了编码.
Jus*_*tin 13
的WebClient用途在HTTP响应的报头中的编码信息,以确定正确的编码(在本例ISO-8859-1这是基于ASCII,即8每个字符的比特)
它似乎XmlDocument.Load不使用此信息,因为xml声明中也缺少编码,它必须猜测编码并将其弄错.一些挖掘让我相信它选择了UTF-8.
如果我们想要获得真正的技术性,那么它所引发的字符是"à",即ISO-8859-1编码中的0xE0,但这不是一个有效的字符UTF-8- 特别是这个字符的二进制表示形式是:
11100000
Run Code Online (Sandbox Code Playgroud)
如果您仔细阅读UTF-8维基百科文章,我们可以看到这表明代码点(即字符)由总共3个字节组成,采用以下格式:
Byte 1 Byte 2 Byte 3
----------- ----------- -----------
1110xxxx 10xxxxxx 10xxxxxx
Run Code Online (Sandbox Code Playgroud)
但是,如果我们回顾一下文档,接下来的两个字符是":",即ISO-8859-1中的0x3A和0x20.这意味着我们最终得到的是:
Byte 1 Byte 2 Byte 3
----------- ----------- -----------
11100000 00111010 00100000
Run Code Online (Sandbox Code Playgroud)
序列的第2个或第3个字节都没有10作为两个最高有效位(这表示继续),因此这个字符在UTF-8中没有任何意义.
| 归档时间: |
|
| 查看次数: |
4507 次 |
| 最近记录: |