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

本文关键字:XML 加载 XDocument URL 包含 | 更新日期: 2023-09-27 18:33:17

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

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

Xml异常未处理:给定编码中的字符无效

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

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

您需要将其 URL 编码为&

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

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

编辑:这里真正的问题与&符号无关,而是与Google使用自定义编码对XML文档进行编码并且未能声明它的方式有关。(仅当 & 符号出现在特殊上下文中时才需要编码,例如 (X(HTML 的 <a href="…" /> 元素。阅读 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 查询它:

Xml异常:给定编码中的字符无效。第 1 行,位置 473

这清楚地指向查询字符串之外。

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

而不是"&"使用"&"或"&amp;"。它会正常工作.