实现读取RSS 2.0的Javascript类
2006-05-23 15:28
537 查看
这几天在学习一些Javascript的东西,新入手,很差,只好自己写一些小例子练手。嗯,放在这里做备份吧。
这是一个能够用于读取RSS 2.0信息,并把读到的东西变成Javascript对象的类。和网上能搜到的代码相比,我这个非常的粗糙,封装的也不一定合理,反正作为练习嘛,达到目的就成
首先当然是要搞清楚RSS 2.0的结构,它最基本的骨架如下:
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title></title>
<link></link>
<description></description>
<item>
<author></author>
<title></title>
<description></description>
<link></link>
<pubDate></pubDate>
</item>
</channel>
</rss>
嗯,这并不是最标准的RSS,而是最简单的RSS。实际的RSS标准可以看http://blogs.law.harvard.edu/tech/rss,还是很复杂的!
然后,为了方便读取RSS的XML中每一个结点的内容,做了一个直接从XML转成Javascript对象的函数,嗯,这个函数可以直接根据Javascript对象的结构来获取数据哦,也就是类似于ORM的东西啦。
function getXmlData(xml, obj) {
for (o in obj) {
if ("object" == typeof(obj[o])) {
getXmlData(xml.getElementsByTagName(o), obj[o]);
} else {
obj[o] = getXmlNodeText(xml.getElementsByTagName(o).item(0));
}
}
}
哦,对了,还有个函数getXmlNodeText没写,这是用来读取XML结点内容的函数。说起来真的很不爽,IE和Gecko在XML DOM的接口方面实在太不统一了,连获取一个结点的内容都不同,IE是.text,Gecko是.textContent。没办法,只好写个函数封装一下了……
function getXmlNodeText(node) {
var undefined;
if (undefined !== node.text) {
return node.text;
} else if (undefined !== node.textContent) {
return node.textContent;
}
return undefined;
}
接下来就是要写这个RSS类了。为了把数据和控制分离,这个RSS类并不包含任何远程访问的代码,仅仅是根据输入的xml结点来获取里面所有的数据。哦,对了,这个类几乎完全没有考虑异常保护的问题……
function RssReader(xml) {
/** Retrieve the information of the tag "channel" in RSS.
@param[in] channel The <channel> node, which is the direct child of <rss>
@return Header object, including title, link and description.
*/
function getHeader(channel) {
var header = {
title: 0,
link: 0,
description: 0
};
getXmlData(channel, header);
return header;
}
/** Retrieve the information of the tag "item" in RSS.
@param[in] item The <item> node, which is the direct child of <channel>
@return Item object, including author, title, link, description and pubDate.
*/
function getItem(item) {
var info = {
author: 0,
title: 0,
link: 0,
description: 0,
pubDate: 0
};
getXmlData(item, info);
return info;
}
var rss = xml.documentElement;
var channel = rss.getElementsByTagName("channel").item(0);
this.header = getHeader(channel);
this.items = [];
var item = channel.getElementsByTagName("item");
for (var i = 0; i < item.length; i++) {
this.items.push(getItem(item.item(i)));
}
}
好了,到最后了!当然是要开始访问远程的RSS Feed了。嗯,这个东西当然就和XMLHTTP的使用有关了,相关的内容已经很成熟了,我也差不多只是CP了一下而已,所以当然就在此略去了。
完成之后,写一点总结和体会:
Javascript中做ORM很简单,甚至于非常的理所当然。这是因为对于任意一个Object(假设叫obj),它的属性(假设叫attrib)天生就有两种访问方式,obj.attrib和obj["attrib"]。再加上for..in的强大功能,从XML到Javascript Object很容易就无敌了。
从XML到Javascript 对象的过程其实也可以看作从XML到JSON的过程,反过来也很容易实现。嗯,如果把getXmlData加强,就可以得到一个XML直接映射到JSON的解决方案,貌似挺不错的。
一开始我并不了解XMLHTTP的安全性问题,所以相反比较浪漫……后来略微浏览了一下AJAX in Action才了解这些细节的东西……原来,XMLHTTP对象不能够随便访问任意一个网站,只能访问当前网站下的其他网页。如果这样做了,浏览器就会报错。嗯,我还试过,如果服务器Redirect到其他URL,XMLHTTP能够自动去访问其他URL,不过在安全性上面还是遵循上面的原则。
嗯,Javascript的东西,真的比较好玩~
这是一个能够用于读取RSS 2.0信息,并把读到的东西变成Javascript对象的类。和网上能搜到的代码相比,我这个非常的粗糙,封装的也不一定合理,反正作为练习嘛,达到目的就成
首先当然是要搞清楚RSS 2.0的结构,它最基本的骨架如下:
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title></title>
<link></link>
<description></description>
<item>
<author></author>
<title></title>
<description></description>
<link></link>
<pubDate></pubDate>
</item>
</channel>
</rss>
嗯,这并不是最标准的RSS,而是最简单的RSS。实际的RSS标准可以看http://blogs.law.harvard.edu/tech/rss,还是很复杂的!
然后,为了方便读取RSS的XML中每一个结点的内容,做了一个直接从XML转成Javascript对象的函数,嗯,这个函数可以直接根据Javascript对象的结构来获取数据哦,也就是类似于ORM的东西啦。
function getXmlData(xml, obj) {
for (o in obj) {
if ("object" == typeof(obj[o])) {
getXmlData(xml.getElementsByTagName(o), obj[o]);
} else {
obj[o] = getXmlNodeText(xml.getElementsByTagName(o).item(0));
}
}
}
哦,对了,还有个函数getXmlNodeText没写,这是用来读取XML结点内容的函数。说起来真的很不爽,IE和Gecko在XML DOM的接口方面实在太不统一了,连获取一个结点的内容都不同,IE是.text,Gecko是.textContent。没办法,只好写个函数封装一下了……
function getXmlNodeText(node) {
var undefined;
if (undefined !== node.text) {
return node.text;
} else if (undefined !== node.textContent) {
return node.textContent;
}
return undefined;
}
接下来就是要写这个RSS类了。为了把数据和控制分离,这个RSS类并不包含任何远程访问的代码,仅仅是根据输入的xml结点来获取里面所有的数据。哦,对了,这个类几乎完全没有考虑异常保护的问题……
function RssReader(xml) {
/** Retrieve the information of the tag "channel" in RSS.
@param[in] channel The <channel> node, which is the direct child of <rss>
@return Header object, including title, link and description.
*/
function getHeader(channel) {
var header = {
title: 0,
link: 0,
description: 0
};
getXmlData(channel, header);
return header;
}
/** Retrieve the information of the tag "item" in RSS.
@param[in] item The <item> node, which is the direct child of <channel>
@return Item object, including author, title, link, description and pubDate.
*/
function getItem(item) {
var info = {
author: 0,
title: 0,
link: 0,
description: 0,
pubDate: 0
};
getXmlData(item, info);
return info;
}
var rss = xml.documentElement;
var channel = rss.getElementsByTagName("channel").item(0);
this.header = getHeader(channel);
this.items = [];
var item = channel.getElementsByTagName("item");
for (var i = 0; i < item.length; i++) {
this.items.push(getItem(item.item(i)));
}
}
好了,到最后了!当然是要开始访问远程的RSS Feed了。嗯,这个东西当然就和XMLHTTP的使用有关了,相关的内容已经很成熟了,我也差不多只是CP了一下而已,所以当然就在此略去了。
完成之后,写一点总结和体会:
Javascript中做ORM很简单,甚至于非常的理所当然。这是因为对于任意一个Object(假设叫obj),它的属性(假设叫attrib)天生就有两种访问方式,obj.attrib和obj["attrib"]。再加上for..in的强大功能,从XML到Javascript Object很容易就无敌了。
从XML到Javascript 对象的过程其实也可以看作从XML到JSON的过程,反过来也很容易实现。嗯,如果把getXmlData加强,就可以得到一个XML直接映射到JSON的解决方案,貌似挺不错的。
一开始我并不了解XMLHTTP的安全性问题,所以相反比较浪漫……后来略微浏览了一下AJAX in Action才了解这些细节的东西……原来,XMLHTTP对象不能够随便访问任意一个网站,只能访问当前网站下的其他网页。如果这样做了,浏览器就会报错。嗯,我还试过,如果服务器Redirect到其他URL,XMLHTTP能够自动去访问其他URL,不过在安全性上面还是遵循上面的原则。
嗯,Javascript的东西,真的比较好玩~
相关文章推荐
- RSS介绍、RSS 2.0规范说明及php实现RSS订阅
- jsp中实现读取RSS——SAX解析XML
- Web 2.0时代RSS的.Net实现
- thinkphp 2.0实现从cookie读取配置设置语言
- Javascript Ajax异步读取RSS文档具体实现
- 使用LINQ读取RSS,比传统的C#2.0方法节省了很多代码
- 用C#实现RSS的生成和解析,支持RSS2.0和Atom格式
- 读取站点更新纪录(RSS2.0) - php篇 :新浪,雅虎新闻,csdn blog...
- 12.5 Ajax实现RSS频道的显示功能 (征服ASP.NET 2.0 Ajax——Web开发技术详解 )
- Web 2.0时代RSS的.Net实现
- Java 中如何实现RSS 2.0
- Web 2.0时代RSS的.Net实现
- 用C#实现RSS的生成和解析,支持RSS2.0和Atom格式
- Javascript Ajax异步读取RSS文档具体实现
- Web 2.0时代RSS的.Net实现
- RSS读取与生成实现原理
- RSS读取与生成实现原理
- IE下使用控件实现读取本地文件功能并显示
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 ASP加javascript实现图片轮流显示(图片路径从数据库中读取)
- Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例