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的源码:

  1. function RssReader(){};     
  2. RssReader.prototype= {     
  3.   /*** 获取RSS并解析.该方法是综合了getRss和parseXmlToJSON两个方法,最终的回调函数的值为
  4. json对象.        */     
  5.     getAndParse : function(/*string*/_url, /*function*/callback) {     
  6.         var parseXml = this.parseRss;     
  7.         this.getRss(_url, function(rssXml) {     
  8.             var json = parseXml(rssXml);     
  9.             callback(json);     
  10.         });     
  11.     },     
  12.          
  13.     /**     
  14.      * 获取rss频道的xml文件内容,以xml对象返回.     
  15.      * @param _url 要获取的RSS的URL地址     
  16.      * @param callback 获取成功或失败后的回调方法,参数为RSS内容的XML对象(失败则返回
  17. null)     
  18.      */     
  19.     getRss : function(/*string*/ _url, /*function*/callback) {     
  20.         new Ajax.Request(     
  21.             _url,     
  22.             {     
  23.                 method : 'GET',     
  24.                 onComplete : function(xmlHttp) {     
  25.                     var rssXml = xmlHttp.responseXML;     
  26.                     if (rssXml == null) alert('非法的RSS频道内容,无法解析!');     
  27.                     callback(rssXml);     
  28.                 }     
  29.             }     
  30.         );     
  31.     },     
  32.          
  33.     /**     
  34.      * 将RSS频道的XML内容转换成JSON对象返回.     
  35.      */     
  36.     parseRss : function(/*object*/rssXml) {     
  37.         try {     
  38.             var rss = rssXml.getElementsByTagName('rss');     
  39.             var channel = rssXml.getElementsByTagName('channel');     
  40.             if (!rss || !channel || rss.length != 1 || channel.length < 1) {     
  41.                 alert('无效的RSS格式:没有rss节点和channel节点!');     
  42.                 return null;     
  43.             }     
  44.             var version = rss.item(0).getAttribute('version');     
  45.             if (!version) {     
  46.                 alert('无效的RSS格式:没有指定RSS版本号!');     
  47.                 return null;     
  48.             }     
  49.             if (version == '2.0'return RssReader.parseRss2_0(channel.item(0));     
  50.                  
  51.             alert('无效的RSS格式:无法确定RSS版本!');     
  52.             return null;     
  53.         } catch (ex) {     
  54.             alert('解析RSS内容时发生错误:' + ex.message);     
  55.             return null;     
  56.         }     
  57.     }     
  58. };     
  59.     
  60. /**     
  61. * Rss2.0格式的静态解析方法,返回结果为JSON对象.     
  62. * 返回的JSON格式为:     
  63. * {"items" : [ {"title" : "标题", "link" : "连接地址"},     
  64. *             {"title" : "标题", "link" : "连接地址"},     
  65. *             {"title" : "标题", "link" : "连接地址"}     
  66. *            ]     
  67. * }     
  68. * 使用方法为(假设最终返回的对象名称为json):     
  69. * json.items.length - 获取总的信息的条数     
  70. * json.items[i] - 获取每一条信息的对象(其中0<=i<json.items.length)     
  71. * json.items[i].title - 获取单条信息的标题文字     
  72. * json.items[i].link - 获取单条信息的连接地址     
  73. */     
  74. RssReader.parseRss2_0 = function(/*object*/channel) {     
  75.     var items = channel.getElementsByTagName('item');     
  76.     var json = '{"items":[';     
  77.     for (var i = 0; i < items.length; i ++) {     
  78.         var item = items.item(i);     
  79.         var _title = item.getElementsByTagName('title')[0];     
  80.         var _link = item.getElementsByTagName('link')[0];     
  81.         if (!_title.hasChildNodes() || !_link.hasChildNodes()) continue;     
  82.         json += '{"title":"' + _title.firstChild.nodeValue.gsub(/"/,"'") + '",';     
  83.         json += '"link":"' + _link.firstChild.nodeValue.gsub(/"/,"'") + '"}';     
  84.         if (i < items.length - 1) json += ',';     
  85.     }     
  86.     json += ']}';     
  87.     //alert(json);     
  88.     return eval('(' + json + ')');     
  89. }; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值