从远程网站解析 xml 数据
Posted
技术标签:
【中文标题】从远程网站解析 xml 数据【英文标题】:Parsing xml data from a remote website 【发布时间】:2012-07-31 11:03:05 【问题描述】:我想解析来自远程网站http://services.faa.gov/airport/status/IAD?format=xml 的 xml 数据...但我无法解析 xml 数据,我只会收到错误消息。但我能够解析来自同一个远程网站http://services.faa.gov/airport/status/IAD?format=json 的 JSON 数据。我用来解析xml数据的代码是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Aviation</title>
<script type="text/javascript" src="Scripts/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
var result;
function xmlparser()
$.ajax(
type: "GET",
url: "http://services.faa.gov/airport/status/IAD?format=xml",
dataType: "xml",
success: function (xml)
result = xml.city;
document.myform.result1.value = result;
,
error: function (xml)
alert(xml.status + ' ' + xml.statusText);
);
</script>
</head>
<body>
<p id="details"></p>
<form name="myform">
<input type="button" name="clickme" value="Click here to show the city name" onclick=xmlparser() />
<input type="text" name="result1" readonly="true"/>
</form>
</body>
</html>
自从我打印了错误消息以来,我只在警告框中收到错误消息“o Error”。请任何人帮忙解析来自远程网站的 xml 数据。 注意:我也有 'City' 而不是 'city' 但它不起作用... 提前谢谢...
【问题讨论】:
Ajax 不能做跨域请求。您必须使用服务器端脚本来代理信息 JavaScript 可以通过 Ajax 进行跨域请求,如果返回的响应是 jsonp。当涉及到 xml 和 json 时,你不能从 JavaScript 发出跨域请求,正如@Pekka 评论的那样,你需要有一个服务器端代理来发送请求。 @Pekka:你能解释一下这个例子怎么做吗???但是我为什么能够使用 JSON 数据在 ajax 中进行跨域请求???谢谢... 是的,甚至 jsonp 都是跨浏览器的灾难(我在 IE6-7 中确实找不到任何方法) IE8 本身也是一场痛苦的灾难(使用 XDomainRequest)。无论如何...服务器端代理是的大声笑 然后您可以使用 JSONP。 jquery 对此提供了支持。但我不认为这是一个跨领域的问题。 Prabu,你能在网络视图中查看响应是什么吗? 【参考方案1】:我不相信这会起作用,因为该服务仍在返回 xml。 jsonp 期望一个 n 对象文字作为参数传递给回调。我相信,如果您在本地运行此程序,您会意识到您的成功没有可消耗的数据。试试这个
$.ajax(
type: "GET",
url: "http://services.faa.gov/airport/status/IAD?format=json",
dataType: "jsonp",
success: function (data)
document.myform.result1.value = data.city;
,
error: function (jqXHR, textStatus, errorThrown)
alert(errorThrown);
);
这是使用 asp.net mvc 3 创建代理的示例。我刚刚创建了一个操作,该操作返回一个映射到字符串的 ContentResult,但我将内容类型定义为 text/xml。这只是向服务发出 web 请求并将流读入字符串以在响应中发送回。
[HttpGet]
public ContentResult XmlExample()
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://services.faa.gov/airport/status/IAD?format=xml");
string xml = null;
using (WebResponse response = request.GetResponse())
using (var xmlStream = new StreamReader(response.GetResponseStream()))
xml = xmlStream.ReadToEnd();
return Content(xml, "text/xml");
您的 xmlParser 函数将如下所示:
<script type="text/javascript">
var result;
function xmlparser()
$.ajax(
type: "GET",
url: "XmlExample",
dataType: "xml",
success: function (xml)
result = $(xml).find("City").text();
document.myform.result1.value = result;
,
error: function (xml)
alert(xml.status + ' ' + xml.statusText);
);
</script>
jQuery ajax 通过在内部使用 $.parseXML 来转换数据,这消除了我们甚至在成功块中调用它的要求。此时,您有一个 jQuery 对象,您可以使用它的默认 DOM 函数来查找 City 节点。
确保将 XmlExample 替换为根据您的控制器映射到的 url。
【讨论】:
不知道为什么我收到了反对票,因为如果您实际运行上面的 ajax 代码,您会看到 data 参数是服务返回的 json。 引自问题“但我能够解析来自同一个远程网站的 JSON 数据”。 OP 已经能够做到这一点,问题是关于 XML。 @Adnan 我想我们在这里分裂头发。你是对的,他问你是否可以通过 JavaScript 从跨域请求中解析 xml。我只是让他知道,除非您使用 jsonp 并为他提供 jsonp 的解决方案,否则您无法完成此跨域。他可以从他的域中创建一个代理,然后通过调用他的代理端点来使用 JavaScript 使用它,该端点又调用 services.faa.gov 服务。 @DeathBedMotorcade,OP 已经知道(我在之前的评论中向您推荐了相同的报价),您没有添加任何内容。说 XML 不起作用可以简单地通过注释来完成。看,你自己知道你没有提供答案(你编辑了你的评论以添加代理的东西),现在如果这是你的答案(也许有一些 php 代理示例),我很乐意支持它。跨度> 【参考方案2】:解决方法很简单(在Pekka的评论中提到)
1.在你的服务器上添加一个文件IAD_proxy.php
2.将以下代码放入其中
header("Content-type: text/xml; charset=utf-8");
echo file_get_contents('http://services.faa.gov/airport/status/IAD?format=xml');
3.将Ajax请求中的url
改为IAD_proxy.php
。
如果您使用任何其他服务器端语言,请尝试实现相同的想法。
编辑:请阅读Parsing XML With jQuery,这是我尝试过的,它正在工作。
JavaScript:
$.ajax(
type: "GET",
url: "IAD_proxy.php",
dataType: "xml",
success: function (xml)
alert($(xml).find('City').text());
,
error: function (xml)
alert(xml.status + ' ' + xml.statusText);
);
这里我用document.write($(xml).find('City').text());
试了一下
【讨论】:
我已经尝试过了...但它显示警告框为“200 OK”...仍然进入“错误”内部,只是正确的??? @unludo,引用自 OP 的评论“有什么解决方案吗???”。我很高兴看到您发布客户端解决方案,在这种情况下,我会学到一些新东西。谢谢你的意见:)以上是关于从远程网站解析 xml 数据的主要内容,如果未能解决你的问题,请参考以下文章