【问题标题】:C# Won't Load A Certain XML, But Works in BrowserC# 不会加载某个 XML,但可以在浏览器中使用
【发布时间】:2025-12-19 13:35:11
【问题描述】:

我是 C# 的新手,但我有 Java 和 VB.NET 的背景,所以入门很容易。这个周末,我用 C# 和来自互联网的公共 XML 提要开始了一个新的小项目。但我在加载 XML 时遇到问题。这是我的代码:

string url = ... ;
...
XmlDocument xmlDoc = new XmlDocument();
...         
try{                
    xmlDoc.Load(url);
}catch(Exception e){
    Console.WriteLine(e);
}

当我尝试加载 XML 时,它会抛出异常:

http://i.stack.imgur.com/Xo2Ra.png (新手不能附图,见谅)

当我的代码不起作用时,我一点也不感到惊讶。我通过找出问题所在开始了标准的故障排除过程。我完全期望我的代码有问题。为了测试这个理论,我在网上找到了一个随机的 XML 提要,并将其复制到我的代码中。令我惊讶的是,它加载得很好。现在我的怀疑转移到了目标 XML。它在 Chrome 和 FireFox 中运行良好(在 0.734 秒内加载),不需要任何凭据(向公众开放),并且有效/格式正确。

然后我想起了几个月前我编写的一个 JavaScript,它使用了相同的提要。我启动了它,发现它也可以正常工作。

我在这里不知所措,因为我的代码和 XML 似乎都很好。有谁知道如何解决这个问题?我是否需要使用 HttpWebRequest 并传递给 XmlDocument(我不知道该怎么做)?还有其他方法可以解决此问题吗?

【问题讨论】:

  • XmlDoc.Load 对于从 Web 获取内容来说是相对原始的。您处理的 URL 是什么?什么协议?它是安全的吗? (https?)在使用 XmlDocument.Load 开箱即用时,两者都会出现问题
  • 这里是 URL,直接来自地址栏:stats.us.playstation.com/warhawk/… ... 编辑:我刚刚在 Chrome 中加载 XML 并直接将 URL 复制/粘贴到此评论。当我检查链接时,我收到了 404 错误。

标签: c# xml


【解决方案1】:

正如我在评论中指出的,与来自浏览器的完整请求相比,XmlDocument.Load 非常原始。当您使用像 Fiddler 这样的代理或数据包跟踪器时,您会发现例如 IE9 发出的请求包括特定的标头:

获取 http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end=1 HTTP/1.1 接受:text/html, application/xhtml+xml, / 接受语言:en-US 用户代理:Mozilla/5.0(兼容;MSIE 9.0; 视窗 NT 6.1; Trident/5.0) 接受编码:gzip、deflate 连接:Keep-Alive 主机:stats.us.playstation.com Cookie: JSESSIONID=HLygTblTG13HhXqqw80jw9Wdhw0q03dxcQLp04fD3Q5yChYvPGn6!-882698034; SONYCOOKIE1=543467712.20480.0000

现在网络服务器的行为受制于请求中指定的标头。在这种情况下,Accept 和 user-agent 发挥作用。我可以通过包含一些如下的假标题成功地将 xml 内容加载到 XmlDocument 中:

        string url = "http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end=1";

        WebClient client = new WebClient();
        client.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
        client.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        string data = client.DownloadString(url);

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(data);

【讨论】:

  • 不错的答案。所以问题不在于 XML,而是服务器在获取浏览器请求标头时的响应方式与从 c# XML dom 对象获取没有标头的请求时的响应方式不同,对吧?
  • @ChrisShain - 确切地说,您必须在代码中手动复制浏览器的行为,或者使用更高级/特定的库为您执行此操作
  • 谢谢!我知道 xmlDoc.Load() 不是执行此操作的最佳方法(我提到尝试在 OP 中使用 HttpWebRequest 的原因),但我真的不确定还可以使用什么/如何使用它。您已经获得了一个脚注,好先生。