从远程网站解析xml数据

时间:2012-08-02 13:07:51

标签: javascript jquery html xml ajax

我想从远程网站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>

由于我打印了错误消息,因此警报框中的错误仅为“错误”。请帮忙解析远程网站的xml数据。 注意:我也有'城市'而不是'城市',但它不起作用...... 提前谢谢......

2 个答案:

答案 0 :(得分:3)

我不相信这会起作用,因为服务仍在返回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。这只是对服务进行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 Node。

请务必根据您的控制器将 XmlExample 替换为其映射到的网址。

答案 1 :(得分: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

如果您使用任何其他服务器端语言,请尝试实现相同的想法。

修改:请阅读Parsing XML With jQuery,这是我尝试过的,并且正在运作。

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