使用包含&符号的URL将XML加载到XDocument

时间:2012-05-04 19:57:17

标签: c# linq-to-xml

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

在调用&方法时,&符号Load()不是包含URL的字符串中的受支持字符。发生此错误:

  

未处理XmlException:给定编码中的字符无效

如何将URL从URL加载到XDocument中,其中URL在查询字符串中有&符号?

3 个答案:

答案 0 :(得分:8)

<击> 您需要对其进行URL编码为&amp;

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

您可以使用WebUtility.HtmlEncode自动执行此转换;但是,请注意,这不是该方法的预期用途。

编辑:这里的真正问题与&符号无关,但是Google使用自定义编码对XML文档进行编码并且无法声明它。 (&符号只有在特殊情境中出现时才需要进行编码,例如(X)HTML的<a href="…" />元素。阅读Ampersands (&'s) in URLs以获得快速解释。)

由于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);

答案 1 :(得分:2)

您的代码没有任何问题 - 在查询字符串中使用&是完全可以的,并且它是如何定义单独的参数。

当您查看错误时,您会看到它无法加载XML,而不是从Url查询错误:

  

XmlException:给定编码中的字符无效。第1行,第473位

明确指出查询字符串之外。

问题可能是XML响应中的“Apsiniaukę”(注意最后一个字符)......

答案 2 :(得分:0)

代替&#34;&amp;&#34;使用&#34; &&#34;或&#34; &amp;&#34; 。它会工作正常。