js解析RSS類

來源:互聯網
上載者:User

因為最近在項目中用到了RSS頻道,所以今天就花了點時間寫了一個JS來解析RSS頻道的類,說白了就是JS解析XML檔案而已,呵呵.我的這個JS類提供解析XML返回JSON對象,便於操作結果集.目前只支援RSS2.0規範的解析,不過我這個JS類也很簡單的,只擷取title和link欄位,其他的就不管了,呵呵,所以對RSS1.0和RSS0.9規範應該都是可以支援的,以後再有時間完善吧.另外,本來是想在web頁面上直接存取RSS頻道地址來的,可忘記了AJAX是不允許跨域訪問的,所以也就只能在後台寫一程式去擷取RSS的內容,然後產生在本地磁碟上,最後web頁面直接存取本地的XML檔案了.

RssReader的源碼:

Jsscript代碼  
  1. 01 /**   
  2. 02 * @title:Rss頻道的讀取與解析類.   
  3. 03 * @author:鐵木箱子   
  4. 04 * @modify:2008-1-8   
  5. 05 */   
  6. 06   
  7. 07 function RssReader(){};   
  8. 08 RssReader.prototype= {   
  9. 09     /**   
  10. 10      * 擷取RSS並解析.該方法是綜合了getRss和parseXmlToJSON兩個方法,最終的回呼函數的值為json對象.   
  11. 11      */   
  12. 12     getAndParse : function(/*string*/_url, /*function*/callback) {   
  13. 13         var parseXml = this.parseRss;   
  14. 14         this.getRss(_url, function(rssXml) {   
  15. 15             var json = parseXml(rssXml);   
  16. 16             callback(json);   
  17. 17         });   
  18. 18     },   
  19. 19        
  20. 20     /**   
  21. 21      * 擷取rss頻道的xml檔案內容,以xml對象返回.   
  22. 22      * @param _url 要擷取的RSS的URL地址   
  23. 23      * @param callback 擷取成功或失敗後的回調方法,參數為RSS內容的XML對象(失敗則返回null)   
  24. 24      */   
  25. 25     getRss : function(/*string*/ _url, /*function*/callback) {   
  26. 26         new Ajax.Request(   
  27. 27             _url,   
  28. 28             {   
  29. 29                 method : 'GET',   
  30. 30                 onComplete : function(xmlHttp) {   
  31. 31                     var rssXml = xmlHttp.responseXML;   
  32. 32                     if (rssXml == null) alert('非法的RSS頻道內容,無法解析!');   
  33. 33                     callback(rssXml);   
  34. 34                 }   
  35. 35             }   
  36. 36         );   
  37. 37     },   
  38. 38        
  39. 39     /**   
  40. 40      * 將RSS頻道的XML內容轉換成JSON對象返回.   
  41. 41      */   
  42. 42     parseRss : function(/*object*/rssXml) {   
  43. 43         try {   
  44. 44             var rss = rssXml.getElementsByTagName('rss');   
  45. 45             var channel = rssXml.getElementsByTagName('channel');   
  46. 46             if (!rss || !channel || rss.length != 1 || channel.length < 1) {   
  47. 47                 alert('無效的RSS格式:沒有rss節點和channel節點!');   
  48. 48                 return null;   
  49. 49             }   
  50. 50             var version = rss.item(0).getAttribute('version');   
  51. 51             if (!version) {   
  52. 52                 alert('無效的RSS格式:沒有指定RSS版本號碼!');   
  53. 53                 return null;   
  54. 54             }   
  55. 55             if (version == '2.0') return RssReader.parseRss2_0(channel.item(0));   
  56. 56                
  57. 57             alert('無效的RSS格式:無法確定RSS版本!');   
  58. 58             return null;   
  59. 59         } catch (ex) {   
  60. 60             alert('解析RSS內容時發生錯誤:' + ex.message);   
  61. 61             return null;   
  62. 62         }   
  63. 63     }   
  64. 64 };   
  65. 65   
  66. 66 /**   
  67. 67 * Rss2.0格式的靜態解析方法,返回結果為JSON對象.   
  68. 68 * 返回的JSON格式為:   
  69. 69 * {"items" : [ {"title" : "標題", "link" : "串連地址"},   
  70. 70 *             {"title" : "標題", "link" : "串連地址"},   
  71. 71 *             {"title" : "標題", "link" : "串連地址"}   
  72. 72 *            ]   
  73. 73 * }   
  74. 74 * 使用方法為(假設最終返回的對象名稱為json):   
  75. 75 * json.items.length - 擷取總的資訊的條數   
  76. 76 * json.items[i] - 擷取每一條資訊的對象(其中0<=i<json.items.length)   
  77. 77 * json.items[i].title - 擷取單條資訊的標題文字   
  78. 78 * json.items[i].link - 擷取單條資訊的串連地址   
  79. 79 */   
  80. 80 RssReader.parseRss2_0 = function(/*object*/channel) {   
  81. 81     var items = channel.getElementsByTagName('item');   
  82. 82     var json = '{"items":[';   
  83. 83     for (var i = 0; i < items.length; i ++) {   
  84. 84         var item = items.item(i);   
  85. 85         var _title = item.getElementsByTagName('title')[0];   
  86. 86         var _link = item.getElementsByTagName('link')[0];   
  87. 87         if (!_title.hasChildNodes() || !_link.hasChildNodes()) continue;   
  88. 88         json += '{"title":"' + _title.firstChild.nodeValue.gsub(/"/,"'") + '",';   
  89. 89         json += '"link":"' + _link.firstChild.nodeValue.gsub(/"/,"'") + '"}';   
  90. 90         if (i < items.length - 1) json += ',';   
  91. 91     }   
  92. 92     json += ']}';   
  93. 93     //alert(json);   
  94. 94     return eval('(' + json + ')');   
  95. 95 };  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.