我是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 feed并将其复制到我的代码中。令我惊讶的是,它加载得很好。现在我的怀疑转移到了目标XML。它适用于Chrome和FireFox(在.734秒内加载),不需要任何凭据(对公众开放),并且有效/格式良好。
然后我想起了几个月前写过的JavaScript,它使用的是同一个feed。我解雇了它,发现它也能完美地工作。
我在这里不知所措,因为我的代码和XML似乎都很好。有谁知道如何解决这个问题?我是否需要使用HttpWebRequest并传递给XmlDocument(我不知道该怎么做)?还有其他方法可以解决这个问题吗?
答案 0 :(得分:4)
正如我在评论中指出的那样,与来自浏览器的完整请求相比,XmlDocument.Load非常原始。当您使用像Fiddler这样的代理或数据包跟踪器时,您会发现例如IE9发出包含特定标头的请求:
GET http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end=1 HTTP / 1.1接受:text / html,application / xhtml + xml, / Accept-Language:en-US User-Agent:Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; Trident / 5.0)Accept-Encoding:gzip,deflate 连接:Keep-Alive Host:stats.us.playstation.com Cookie: JSESSIONID = HLygTblTG13HhXqqw80jw9Wdhw0q03dxcQLp04fD3Q5yChYvPGn6 -882698034!; SONYCOOKIE1 = 543467712.20480.0000
现在,网络服务器的行为受到请求中指定的标头的影响。在这种情况下,Accept和user-agent扮演一个角色。我可以通过包含一些假的标题来成功地在XmlDocument中加载xml内容,如下所示:
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);