2011-11-23 122 views

回答

35

(你不能用Google搜索了很多。)後,一旦你有worked around the Same Origin Policy,如果資源供應與XML MIME type(其中it is in this casetext/xml),你可以做到以下幾點:

var x = new XMLHttpRequest(); 
x.open("GET", "http://feed.example/", true); 
x.onreadystatechange = function() { 
    if (x.readyState == 4 && x.status == 200) 
    { 
    var doc = x.responseXML; 
    // … 
    } 
}; 
x.send(null); 

(見AJAX,和其他事件處理程序的道具規範XMLHttpRequest Level 2 [工作草案] )

本質上:不需要解析。如果您想要訪問XML數據,請使用標準DOM Level 2+ CoreDOM Level 3 XPath方法,例如,

/* DOM Level 2 Core */ 
var title = doc.getElementsByTagName("channel")[0].getElementsByTagName("title")[0].firstChild.nodeValue; 

/* DOM Level 3 Core */ 
var title = doc.getElementsByTagName("channel")[0].getElementsByTagName("title")[0].textContent; 

/* DOM Level 3 XPath (not using namespaces) */ 
var title = doc.evaluate('//channel/title/text()', doc, null, 0, null).iterateNext(); 

/* DOM Level 3 XPath (using namespaces) */ 
var namespaceResolver = (function() { 
    var prefixMap = { 
    media: "http://search.yahoo.com/mrss/", 
    ynews: "http://news.yahoo.com/rss/" 
    }; 

    return function (prefix) { 
    return prefixMap[prefix] || null; 
    }; 
}()); 

var url = doc.evaluate('//media:content/@url', doc, namespaceResolver, 0, null).iterateNext(); 

(爲方便,命名空間感知的DOM 3的XPath不使用jQuery的包裝也見JSX:xpath.js。)

但是,如果由於某種(錯誤的)原因,MIME類型不是XML MIME類型,或者如果它沒有被DOM實現識別,您可以使用內置在最新瀏覽器中的一個解析器來解析屬性值。有關在IE/MSXML中運行的解決方案,請參閱pradeek's answer。以下應該可以在其他地方使用:

var parser = new DOMParser(); 
var doc = parser.parseFromString(x.responseText, "text/xml"); 

按上述步驟操作。

在運行時使用功能測試來確定給定實現的正確代碼分支。最簡單的方法是:

if (typeof DOMParser != "undefined") 
{ 
    var parser = new DOMParser(); 
    // … 
} 
else if (typeof ActiveXObject != "undefined") 
{ 
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
    // … 
} 

另請參閱DOMParserHTML5: DOM Parsing and Serialization (Working Draft)

10

您可能遇到的一個大問題是,通常情況下,您無法獲取數據跨域。這是大多數rss提要的大問題。

在javascript跨域中處理加載數據的常用方法是調用JSONP。基本上,這意味着你正在檢索的數據被封裝在一個JavaScript回調函數中。您使用腳本標記加載url,然後在代碼中定義函數。所以當腳本加載時,它會執行該函數並將數據作爲參數傳遞給它。

大多數xml/rss提要的問題是僅提供xml的服務往往不提供JSONP包裝功能。

在您走得更遠之前,請檢查您的數據源是否提供了json格式和JSONP功能。這將使這更容易。

現在,如果您的數據源不提供提供的json和jsonp功能,您必須具有創意。

處理這個問題的相對簡單的方法是使用代理服務器。您的代理在您的控制之下運行,並充當中間人來獲取您的數據。服務器加載你的XML,然後你的JavaScript代替它做請求。如果代理服務器在相同的域名上運行,那麼您可以使用標準的xhr(ajax)請求,而不必擔心跨域的問題。

或者,您的代理服務器可以將數據包裝在jsonp回調中,您可以使用上述方法。

如果您使用的是jQuery,那麼xhr和jsonp請求是內置方法,因此使編碼變得非常簡單。其他常見的js庫也應該支持這些。如果你從頭開始編寫所有這些代碼,那麼它需要做更多的工作,但不是非常困難。

現在,一旦你得到你的數據,希望它只是json。然後,不需要解析。但是,如果最終不得不堅持使用xml/rss版本,並且如果您是jQuery,則可以簡單地使用jQuery.parseXML http://api.jquery.com/jQuery.parseXML/

0

更好地將xml轉換爲json。 http://jsontoxml.utilities-online.info/

轉換,如果你需要打印JSON對象檢查本教程 http://www.w3schools.com/json/json_eval.asp

+0

如果正確執行XML(即,如果考慮了XML名稱空間),則將XML轉換爲JSON可以在語法上有所幫助(更短,性能更好的訪問器) - 但這是不必要的,並且所得到的數據結構不如XML文檔靈活(JSPath,JSSLT任何人?)。 (不幸的是,你的第一個URI是404兼容的。)BTW,W3School(與W3C無關)是一個充滿誤導的網站,最好避免。 – PointedEars

+0

現在網站已恢復在線狀態,我可以查看轉換器。這真的不壞。命名空間和Unicode被考慮;屬性名稱是「'-'」 - 前綴;具有相同名稱的節點是陣列化的;甚至解析器錯誤都會被序列化。不過,還有改進的空間。例如:所有序列化的值都是字符串;對於布爾屬性,您可以使用簡單的'true'節省一些開銷,這是JSON的一部分。轉換不是雙射的(可能的話):toJSON(toXML(json))!= json。 – PointedEars

+0

@NathanSri第一個鏈接已經死了,你能更新你的答案嗎? – Hugo