从远程网站解析xml数据

问题描述:

我想解析来自远程网站的xml数据http://services.faa.gov/airport/status/IAD?format=xml ...但我无法解析xml数据,我只是得到错误。但是我能够解析来自同一个远程网站http://services.faa.gov/airport/status/IAD?format=json的JSON数据。我已经使用解析XML数据的代码是:从远程网站解析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错误”。任何人请帮助解析来自远程网站的XML数据。 注意:我也有,而不是“城市”,但它不工作... 在此先感谢...

+3

阿贾克斯不能做跨域请求。您将不得不使用服务器端脚本来代理信息 – 2012-08-02 13:09:51

+0

如果返回的响应是jsonp,则JavaScript可以通过Ajax执行跨域请求。当谈到xml和json时,你不能从JavaScript做跨域请求,并且@Pekka评论说你需要有一个服务器端代理来发送请求。 – JustinMichaels 2012-08-02 13:16:08

+0

@Pekka:请你解释一下如何用这个例子来做?但是,我怎么能够在使用JSON数据的Ajax中跨域请求?谢谢你... – 2012-08-02 13:17:17

我不相信会工作,因为该服务仍在返回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类型的行动,但我定义的内容类型为文本/ 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功能来查找城市节点。

确保使用它根据您的控制器映射到的URL替换XmlExample

+0

不知道为什么我收到了一个反对票,因为如果你实际运行上面的ajax代码,你会看到数据参数是服务返回的json。 – JustinMichaels 2012-08-02 13:39:49

+0

同样适用于我 - 我upvote你:) – unludo 2012-08-02 13:40:09

+0

引用问题“_But我能够解析来自同一个远程website_的JSON数据”。 OP已经能够做到这一点,问题是关于XML。 – Adi 2012-08-02 13:41:03

解决的办法很简单(在的Pekka评论中提及)

1.On您的服务器2.Put下面的代码添加文件IAD_proxy.php

里面

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

+0

我试过这个......但是它显示的警报框为'200 OK'...仍然在里面'错误'只有正确吗? – 2012-08-02 14:12:34

+0

这个问题没有要求服务器端解决方案... – unludo 2012-08-02 14:46:31

+0

@prabuR,我已经编辑我的答案给你。 – Adi 2012-08-02 15:05:17