因为最近在项目中用到了RSS频道,所以今天就花了点时间写了一个JS来解析RSS频道的类,说白了就是JS解析XML文件而已,呵呵.我的这个JS类提供解析XML返回JSON对象,便于操作结果集.目前只支持RSS2.0规范的解析,不过我这个JS类也很简单的,只获取title和link字段,其他的就不管了,呵呵,所以对RSS1.0和RSS0.9规范应该都是可以支持的,以后再有时间完善吧.另外,本来是想在web页面上直接访问RSS频道地址来的,可忘记了AJAX是不允许跨域访问的,所以也就只能在后台写一程序去获取RSS的内容,然后生成在本地磁盘上,最后web页面直接访问本地的XML文件了.
RssReader的源码:
RssReader的源码:
- function RssReader(){};
- RssReader.prototype= {
- /*** 获取RSS并解析.该方法是综合了getRss和parseXmlToJSON两个方法,最终的回调函数的值为
- json对象. */
- getAndParse : function(/*string*/_url, /*function*/callback) {
- var parseXml = this.parseRss;
- this.getRss(_url, function(rssXml) {
- var json = parseXml(rssXml);
- callback(json);
- });
- },
- /**
- * 获取rss频道的xml文件内容,以xml对象返回.
- * @param _url 要获取的RSS的URL地址
- * @param callback 获取成功或失败后的回调方法,参数为RSS内容的XML对象(失败则返回
- null)
- */
- getRss : function(/*string*/ _url, /*function*/callback) {
- new Ajax.Request(
- _url,
- {
- method : 'GET',
- onComplete : function(xmlHttp) {
- var rssXml = xmlHttp.responseXML;
- if (rssXml == null) alert('非法的RSS频道内容,无法解析!');
- callback(rssXml);
- }
- }
- );
- },
- /**
- * 将RSS频道的XML内容转换成JSON对象返回.
- */
- parseRss : function(/*object*/rssXml) {
- try {
- var rss = rssXml.getElementsByTagName('rss');
- var channel = rssXml.getElementsByTagName('channel');
- if (!rss || !channel || rss.length != 1 || channel.length < 1) {
- alert('无效的RSS格式:没有rss节点和channel节点!');
- return null;
- }
- var version = rss.item(0).getAttribute('version');
- if (!version) {
- alert('无效的RSS格式:没有指定RSS版本号!');
- return null;
- }
- if (version == '2.0') return RssReader.parseRss2_0(channel.item(0));
- alert('无效的RSS格式:无法确定RSS版本!');
- return null;
- } catch (ex) {
- alert('解析RSS内容时发生错误:' + ex.message);
- return null;
- }
- }
- };
- /**
- * Rss2.0格式的静态解析方法,返回结果为JSON对象.
- * 返回的JSON格式为:
- * {"items" : [ {"title" : "标题", "link" : "连接地址"},
- * {"title" : "标题", "link" : "连接地址"},
- * {"title" : "标题", "link" : "连接地址"}
- * ]
- * }
- * 使用方法为(假设最终返回的对象名称为json):
- * json.items.length - 获取总的信息的条数
- * json.items[i] - 获取每一条信息的对象(其中0<=i<json.items.length)
- * json.items[i].title - 获取单条信息的标题文字
- * json.items[i].link - 获取单条信息的连接地址
- */
- RssReader.parseRss2_0 = function(/*object*/channel) {
- var items = channel.getElementsByTagName('item');
- var json = '{"items":[';
- for (var i = 0; i < items.length; i ++) {
- var item = items.item(i);
- var _title = item.getElementsByTagName('title')[0];
- var _link = item.getElementsByTagName('link')[0];
- if (!_title.hasChildNodes() || !_link.hasChildNodes()) continue;
- json += '{"title":"' + _title.firstChild.nodeValue.gsub(/"/,"'") + '",';
- json += '"link":"' + _link.firstChild.nodeValue.gsub(/"/,"'") + '"}';
- if (i < items.length - 1) json += ',';
- }
- json += ']}';
- //alert(json);
- return eval('(' + json + ')');
- };