js解析RSS类

因为最近在项目中用到了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 };  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值