`
ferreousbox
  • 浏览: 284634 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

js解析RSS

    博客分类:
  • AJAX
阅读更多
    因为最近在项目中用到了RSS频道,所以今天就花了点时间写了一个JS来解析RSS频道的类,说白了就是JS解析XML文件而已,呵呵.我的这个JS类提供解析XML返回JSON对象,便于操作结果集.目前只支持RSS2.0规范的解析,不过我这个JS类也很简单的,只获取title和link字段,其他的就不管了,呵呵,所以对RSS1.0和RSS0.9规范应该都是可以支持的,以后再有时间完善吧.另外,本来是想在web页面上直接访问RSS频道地址来的,可忘记了AJAX是不允许跨域访问的,所以也就只能在后台写一程序去获取RSS的内容,然后生成在本地磁盘上,最后web页面直接访问本地的XML文件了.

RssReader的源码:

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

分享到:
评论
1 楼 cwftalus 2010-06-03  
这个怎么用呢

相关推荐

Global site tag (gtag.js) - Google Analytics