次のようにURLエンコードする必要があります&
:
XDocument xd = XDocument.Load(
"http://www.google.com/ig/api?weather=vilnius&hl=lt");
WebUtility.HtmlEncode
この変換を自動的に実行するために使用することをやめることができるかもしれません。ただし、これはその方法の使用目的ではないことに注意してください。
編集:ここでの本当の問題はアンパサンドとは何の関係もありませんが、Googleがカスタムエンコーディングを使用してXMLドキュメントをエンコードし、それを宣言できない方法とは関係ありません。<a href="…" />
(アンパサンドは、(X)HTMLの要素など、特別なコンテキスト内で発生する場合にのみエンコードする必要があります。簡単な説明については、URLのアンパサンド(&)を参照してください。)
XML宣言はエンコーディングを指定していないためXDocument.Load
、実際のデータと互換性のないXML仕様で要求されているデフォルトのUTF-8エンコーディングに内部的にフォールバックしています。
この問題を回避するには、以下のサンプルを使用して生データをフェッチし、手動でデコードします。エンコーディングが本当にWindows-1252であるかどうかはわかりません。そのため、他のエンコーディングで少し実験する必要があるかもしれません。
string url = "http://www.google.com/ig/api?weather=vilnius&hl=lt";
byte[] data;
using (WebClient webClient = new WebClient())
data = webClient.DownloadData(url);
string str = Encoding.GetEncoding("Windows-1252").GetString(data);
XDocument xd = XDocument.Parse(str);