8

この質問に答えてみると、わからない状況に出くわしました。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。

の窒息のようàです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宣言ではエンコーディングが省略されています。

4

2 に答える 2

13

WebClient、HTTP応答のヘッダーにあるエンコーディング情報を使用して、正しいエンコーディングを決定します(この場合、ASCIIベースのISO-8859-1、つまり1文字あたり8ビット)。

この情報を使用していないようXmlDocument.Loadです。また、xml宣言からエンコーディングが欠落しているため、エンコーディングを推測する必要があり、間違っています。少し掘り下げてみると、UTF-8が選択されていると思います。

本当に技術的になりたい場合、スローされる文字は「à」です。これはISO-8859-1エンコーディングでは0xE0ですが、これは有効な文字ではありません。UTF-8具体的には、この文字のバイナリ表現は次のとおりです。

11100000

UTF-8 Wikipediaの記事を調べてみると、これは、次の形式の合計3バイトで構成されるコードポイント(つまり文字)を示していることがわかります。

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

しかし、ドキュメントを振り返ると、次の2文字は「:」です。これはISO-8859-1では0x3Aと0x20です。これは、私たちが実際に最終的に得られるものは次のとおりであることを意味します。

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

シーケンスの2番目と3番目のバイトのどちらにも、10最上位2ビット(継続を示す)がないため、この文字はUTF-8では意味がありません。

于 2011-09-21T09:25:13.117 に答える
2

ノードの内部テキストとしてのUmidità文字列は<![CDATA [Umidità]]>これにより、XmlDocument.Loadでエラーが発生することはありません。

于 2011-09-21T09:56:02.367 に答える