XDocument xd = XDocument.Load("http://www.google.com/ig/api?weather=vilnius&hl=lt");
调用该方法&
时,在包含 URL 的字符串中,与号不是受支持的字符。Load()
发生此错误:
XmlException 未处理:给定编码中的字符无效
如何将 XML 从 URL 加载到 XDocument 中,其中 URL 在查询字符串中有一个 & 符号?
XDocument xd = XDocument.Load("http://www.google.com/ig/api?weather=vilnius&hl=lt");
调用该方法&
时,在包含 URL 的字符串中,与号不是受支持的字符。Load()
发生此错误:
XmlException 未处理:给定编码中的字符无效
如何将 XML 从 URL 加载到 XDocument 中,其中 URL 在查询字符串中有一个 & 符号?
您需要将其 URL 编码为&
:
XDocument xd = XDocument.Load(
"http://www.google.com/ig/api?weather=vilnius&hl=lt");
您也许可以不用使用WebUtility.HtmlEncode
自动执行此转换;但是,请注意这不是该方法的预期用途。
编辑:这里的真正问题与 & 号无关,而是与 Google 使用自定义编码对 XML 文档进行编码并且未能声明它的方式有关。(与符号仅在出现在特殊上下文中时才需要编码,例如<a href="…" />
(X)HTML 的元素。请阅读URL中的与符号 (&'s) 以获得快速解释。)
由于 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);
您的代码没有任何问题 -&
在查询字符串中包含它是完全可以的,这就是定义单独参数的方式。
当您查看错误时,您会看到它无法加载 XML,而不是从 Url 查询它:
XmlException:给定编码中的无效字符。第 1 行,位置 473
这清楚地指向您的查询字符串之外。
问题可能是 XML 响应中的“Apsiniaukę”(注意最后一个字符)......
而不是 "&" 使用 " &
" 或 " &
" 。它会正常工作。