从远程网站解析xml数据

4
我想解析来自远程网站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”,但它没有起作用…… 提前致谢……


3
Ajax 无法进行跨域请求。您需要使用服务器端脚本代理信息。 - Pekka
JavaScript可以通过Ajax进行跨域请求,如果返回的响应是jsonp。但是当涉及到xml和json时,您不能从JavaScript中进行跨域请求,如@Pekka所评论的,您需要有一个服务器端代理来发送请求。 - JustinMichaels
你可以使用JSONP。jQuery提供了支持。但我不认为这是跨域问题。Prabu,你能在网络视图中检查一下响应吗? - unludo
@unludo:它只显示错误状态为“0”,错误文本为“错误”... - prabu R
@unludo:它显示警告框为“200成功”,但为什么数据没有被解析??? - prabu R
显示剩余9条评论
2个回答

3

我不认为这会起作用,因为服务仍在返回xml。jsonp期望将对象文字作为参数传递给回调函数。我相信如果你在本地运行这个程序,你会意识到成功后没有数据可供消耗。尝试这个:

$.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。这只是简单地向服务发出webrequest并将流读取到字符串中,以便在响应中发送回去。
[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代码,你会看到数据参数是由服务返回的json。 - JustinMichaels
引用问题中的一句话:“但是我已经能够解析来自同一个远程网站的JSON数据”。楼主已经可以做到这一点,问题是关于XML的。 - Adi
@Adnan 我想我们在这里纠结了。你是正确的,他问的是是否可以通过JavaScript从跨域请求解析xml。我只是让他知道,除非使用jsonp,否则无法实现跨域。我给了他jsonp的解决方案。他可以从自己的域创建代理,然后通过调用代理端点来使用JavaScript消费它,代理端点再调用services.faa.gov服务。 - JustinMichaels
@DeathBedMotorcade,OP已经知道了(请参考我在上一个评论中的同样引用),你没有增加任何内容。说XML行不通只需要用注释就可以简单地实现。你自己知道你没有提供答案(你编辑了评论添加代理的内容),如果这是你的答案(也许有一些PHP代理示例),我会很高兴地点赞的。 - Adi
@prabu R 如果您正在使用asp.net mvc作为服务器端代码,我可以给您提供一个代理示例。 - JustinMichaels

3

解决方案非常简单(在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

如果您使用其他服务器端语言,请尝试实现相同的思路。

编辑:请阅读关于使用jQuery解析XML,这是我尝试并且正在工作的内容。

Javscript:

$.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());进行了测试。

enter image description here


我已经尝试过这个了...但它显示的警告框是“200 OK”...仍然只会进入“错误”对吧??? - prabu R
@unludo,引用自OP的评论“这有什么解决方案吗??”。如果您能发布一个客户端解决方案,我会非常高兴,这样我就可以学到新东西了。感谢您的贡献 :) - Adi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接