2012-08-02 138 views
3

我想解析來自遠程網站的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

回答

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類型的行動,但我定義的內容類型爲文本/ 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

3

解決的辦法很簡單(在的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