javascript|rss
這幾天在學習一些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的東西,真的比較好玩~