1
XDocument xd = XDocument.Load("http://www.google.com/ig/api?weather=vilnius&hl=lt");

アンパサンドは、メソッド&を呼び出すときにURLを含む文字列でサポートされている文字ではありません。Load()このエラーが発生します:

XmlExceptionが処理されませんでした:指定されたエンコーディングで無効な文字

URLからクエリ文字列にアンパサンドが含まれるXDocumentにXMLをロードするにはどうすればよいですか?

4

3 に答える 3

8

次のように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);
于 2012-05-04T19:59:36.450 に答える
2

コードに問題はありません&。クエリ文字列に含めることはまったく問題ありません。これは、個別のパラメータを定義する方法です。

エラーを見ると、URLからのクエリではなく、XMLのロードに失敗していることがわかります。

XmlException:指定されたエンコーディングの文字が無効です。1行目、473位

これは明らかにクエリ文字列の外側を指しています。

問題は、XML応答の「Apsiniaukę」(最後の文字に注意)である可能性があります。

于 2012-05-04T20:38:23.530 に答える
0

「&」の代わりに「&」または「 」を使用します&amp;。そしてそれはうまくいくでしょう。

于 2016-04-13T06:13:41.503 に答える