您好,我想從使用純Java腳本(不是jQuery)的http://rss.news.yahoo.com/rss/entertainment這樣的實時URL解析xml/rss。我搜索了很多。沒有爲我工作。任何人都可以幫助完成一段代碼。使用Java腳本解析來自URL的XML/RSS
回答
(你不能用Google搜索了很多。)後,一旦你有worked around the Same Origin Policy,如果資源供應與XML MIME type(其中it is in this case, text/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+ Core或DOM 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");
// …
}
另請參閱DOMParser
和HTML5: DOM Parsing and Serialization (Working Draft)。
您可能遇到的一個大問題是,通常情況下,您無法獲取數據跨域。這是大多數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/。
更好地將xml轉換爲json。 http://jsontoxml.utilities-online.info/
轉換,如果你需要打印JSON對象檢查本教程 http://www.w3schools.com/json/json_eval.asp
如果正確執行XML(即,如果考慮了XML名稱空間),則將XML轉換爲JSON可以在語法上有所幫助(更短,性能更好的訪問器) - 但這是不必要的,並且所得到的數據結構不如XML文檔靈活(JSPath,JSSLT任何人?)。 (不幸的是,你的第一個URI是404兼容的。)BTW,W3School(與W3C無關)是一個充滿誤導的網站,最好避免。 – PointedEars
現在網站已恢復在線狀態,我可以查看轉換器。這真的不壞。命名空間和Unicode被考慮;屬性名稱是「'-'」 - 前綴;具有相同名稱的節點是陣列化的;甚至解析器錯誤都會被序列化。不過,還有改進的空間。例如:所有序列化的值都是字符串;對於布爾屬性,您可以使用簡單的'true'節省一些開銷,這是JSON的一部分。轉換不是雙射的(可能的話):toJSON(toXML(json))!= json。 – PointedEars
@NathanSri第一個鏈接已經死了,你能更新你的答案嗎? – Hugo
- 1. 無法使用java腳本解析xml DOM(來自文件)
- 2. 用CGI腳本解析URL
- 3. 使用Google應用腳本解析URL
- 4. 使用Hpple解析iPhone上的Java腳本的URL
- 5. 使用Javascript解析JSON來自URL
- 6. 使用C#解析來自URL的JSON數組,使用 - in classname
- 7. 解析網站的linux腳本(url)
- 8. Swift解析來自url的JSON
- 9. 解析來自URL的JSON數據
- 10. 解析來自URL的JSON文件
- 11. android解析來自url的xml
- 12. 解析來自url的json文件
- 13. 使用Aeson解析來自Haskell中的URL的JSON數據
- 14. 解析來自Url的Json數據 - 空值返回 - Java
- 15. 如何使用Google腳本解析頁面中的所有URL?
- 16. 使用scrapy解析函數來解析一個特定的url
- 17. 如何使用asyncTask解析來自多個URL的數據
- 18. 如何使用該url解析來自cellcom的響應?
- 19. 如何使用JavaScript解析來自不同URL的html?
- 20. 解析HTML標籤的Java腳本
- 21. 使用shell腳本解析文本
- 22. 如何使用基本身份驗證解析來自URL的JSON
- 23. 使用Retrofit解析來自本地JSON文件的文本
- 24. 解析腳本?
- 25. 分析或使用來自被調用腳本的變量?
- 26. 使用Google Apps腳本解析來自XML元素的所有值?
- 27. 解析來自node.js腳本的HTTP請求
- 28. 在java中使用自定義設計的特定xpath腳本解析html
- 29. 如何使用java腳本解析json文件中的數據
- 30. 在Google中使用unicode翻譯來自python腳本的url
使用jQuery有什麼問題? (它使事情變得更容易) – Nathan
爲什麼你不試試jQuery? – Raptor
對不起。我必須在這個任務中只使用Java腳本。 –