gpt4 book ai didi

c# - XmlDocument.Load 失败,LoadXml 有效 :

转载 作者:太空狗 更新时间:2023-10-29 18:16:45 27 4
gpt4 key购买 nike

在回答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 : Invalid character in the given encoding. Line 1, position 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);

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

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

最佳答案

WebClient使用 HTTP 响应 header 中的编码信息来确定正确的编码(在本例中为 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 中没有意义。

关于c# - XmlDocument.Load 失败,LoadXml 有效 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7497371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com