自從我上一次為 developerWorks 撰寫關於 RSS 的文章以來,“ An introduction to RSS news feeds”,時間已經過去了三年。當時,RSS 是比較流行的 XML 應用之一。後來,Netscape 放棄了這種格式,出現了 5 種(都算上有 5 種)新版本的 RSS 規范,關於這種格式還存在嚴重的分歧。
盡管存在這些缺陷,RSS 還是得到了前所未有的普及。
RSS 無處不在!
今天,您可以發現成千上萬的 RSS 提要。Weblog 用戶、新聞出版商、政府代理以及許多個人和商業 Web 站點都支持這種格式。Java 技術、PERL、PHP、Python 和其他主要編程語言,都為開發人員提供了處理 RSS 的工具。許多閱讀器和聚集器都工作在 Web、桌面甚至 e-mail 客戶程序中。RSS 已成為 Internet 上連鎖內容和元數據事實上的標准。
本文將觀察現行的 RSS 2.0 規范。我不准備討論格式上豐富多彩的特征以及圍繞它的爭論,否則就無法討論其他內容了。
相反,本文將為您提供少量背景知識,考察這種格式的用法,並列出一些比較流行的處理這種格式的工具。文中將討論這種格式的具體細節,給您一些例子,並說明在開始之前您需要了解哪些東西。最後,本文將涉及到 RSS 2.0 的一些新特性。在文章的最後,您將找到豐富的礦藏 —— 一份長長的、帶有注釋的 RSS 參考資料列表。
“RSS”究竟代表什麼?
和許多標准一樣,即使最基本的方面也很難讓人們達成一致。有人說它表示 “RDF Site Summary(RDF 站點摘要)”,其他人則說是“Really Simple Syndication(真正簡單的連鎖)”,還有人相信它代表 “Rich Site Summary(豐富站點摘要)”。
根據 Dave Winer(他是現行規范的作者)的觀點,“關於 RSS 代表什麼沒有一致的看法,它不是一個首字母縮寫詞,而是一個名稱。規范的最新版本可能稱它是縮寫詞,但願不會影響到太多應用程序。”
無論如何,RSS 都代表一件事 —— 在 Internet 上連鎖內容的一種格式。
這要看您問的是誰!
什麼是 RSS?
RSS 是 Internet 上連鎖內容和元數據的一種格式。通常用於共享標題和到新聞文章的鏈接。對於新聞文章,真正的文章不一定是共享的,但是關於文章的元數據通常是共享的;這種元數據可以包含標題、URL或者摘要。對於出版商而言,RSS 是一種重要的工具,因為提要可用於連鎖內容,並把第三方的內容集成到您的站點中。
RSS 是一種 XML 方言。所有的 RSS 文件必須符合萬維網聯盟(World Wide Web Consortium,W3C)Web 站點上發布的 XML 1.0 規范。
下面是一個典型的例子,說明了如何使用 RSS:
一個出版商有一些希望發布的內容。
他們為這些內容創建了一個 RSS 頻道。
在這個頻道中包含了關於希望宣傳的網頁的一些項。
這個頻道可以被遠程應用程序讀取並轉換成標題和鏈接。這些鏈接可以加入到新的 Web 頁中或者供專門的讀者閱讀。
人們從不同的站點看到這個鏈接,單擊連接進入最初出版商的網站。
盡管標題連鎖是最常見的 RSS 用法,但也可用於其他目的。RSS 在 weblog 社區中是一種非常流行的格式。它也被用於照片簿、分類廣告列表、食譜、評論以及跟蹤軟件包的狀態。
RSS 提要在電子商務中用作一種傳遞信息的方式。比如,Amazon 根據其 Web 服務平台向客戶提供新聞提要。從而使您能夠在新聞閱讀器中了解最暢銷的圖書,或者在您的 Web 站點中包括關於 Amazon 銷售的相關圖書的信息。
過去幾年中,RSS 在普及性方面有了驚人的增長。Syndic8.com 維護了一個 RSS 頻道索引,它的提要列表在兩年中加長了大約 1400%。Yahoo 新聞、BBC、Slashdot、LockerGnome、Amazon、CNN、Wired、Rolling Stone 和 Apple Computer 都位於許多最普及的 RSS 提要來源之列。
新聞閱讀器
隨著新聞提要數量的增加,出現了一種新的軟件類型:新聞閱讀器。新聞閱讀器是 個人聚集器—— 幫助您發現和組織感興趣的頻道列表。一旦選擇了頻道,您就可以使用閱讀器一致的界面查看這些頻道。新聞閱讀器檢查您所感興趣的頻道的更新,並轉化成可以浏覽的 Html。
一種流行的新聞閱讀器是 BlogExpress:
圖 1. 在 BlogExpress 中查看 alphaWorks
圖片看不清楚?請點擊這裡查看原圖(大圖)。
BlogExpress 是所謂的“匹薩軟件”—— 意思是說,如果您喜歡這個軟件,您可以寄給作者一些買匹薩餅的錢。
定制頻道
在 BlogExpress 中增加一個頻道很容易。比方說,您對追蹤 IBM alphaWorks站點上的活動感興趣。您要做的第一件事是,取一個要增加的提要:
圖 2. 在 alphaWorks 找到的新聞提要
增加一個提要很容易,桔黃色的“XML”標志常用於鏈接公共 RSS 提要。在多數 Web 浏覽器中,您都可以右擊“XML”標志復制鏈接並粘貼到您的新聞閱讀器中。
發現 RSS 提要
可以使用搜索引擎查找 RSS 格式的內容。比方說使用 Google 時,您可以在查找中增加“filetype:rss”以搜索 .rss 文件中的查找項。
專門的搜索引擎使內容搜索更加容易。Feedster 監視 weblog 並允許您通過一個日志項索引查找,按照相關性、日期、等級(logrank)查看。當您在搜索時,Feedster 按照您的要求創建一個 RSS 提要。這個提要可以增加到您的新聞閱讀器中,以便您能夠看到所有與搜索請求有關的最新活動,您甚至不需要離開新聞閱讀器。
DayPop 搜索新聞、blog 和 RSS 提要。它讓您在 weblog 世界跟蹤流行的新聞。它提供了目前最流行的 40 個 weblog 鏈接。這是全世界最流行文章的鏈接。它創建了一個 weblog 中所用最熱門詞匯的列表。它還根據引用對 weblog 評級,提供最受其他 weblogger 歡迎的 weblog 列表。您也可以自定義搜索。評級列表和自定義搜索都有 RSS 提要形式,可以導入您的新聞閱讀器。
RSS 2.0 的新特性
RSS 2.0 建立在 RSS 0.91 規范的基礎上。它是向後兼容的,因此任何處理 RSS 2.0 的工具應該也能夠處理 0.91 提要。升級後的規范增加了少量元素,比如 <cloud> 和 <guid> 。
它也去掉了一些限制。在過去, <link> 和 <url> 元素只能是 http 或 FTP,現在可以使用任何有效的 URI。在 RSS 0.91 中,每個頻道只能包含 15 個項,而且元素的長度也有限制,現在這些限制都取消了。不過仍然應該小心使用較大的值,因為它們可能對老的應用程序造成問題。
不過更大的變化是能夠使用名稱空間擴展這種格式。RSS 2.0 支持名稱空間,一種增加規范中沒有的元素的標准方法。只要定義在一個名稱空間中,提要可以包含新的元素。
RSS 2.0 概述
RSS 是一種 XML 方言,用於連鎖 Web 內容和元數據。RSS 0.91 是幾種可用版本中最常用的一種。對於新的 RSS 提要,更好的辦法是使用 2.0 版,因為這是現行的規范,而且如前所述,它與 0.91 向後兼容。
Dave Winer 編寫了規范的 2.0 版。規范的修改可能變得難以使用,或者損害已有的應用程序,他有意識地避免了這種情況。Winer 總結了他的思想:“保持簡單。這就是 RSS 的價值所在。任何稍微了解 Html 的人都能夠理解 RSS。這一點極其重要!”
該規范在 Creative Commons 許可下發布。這意味著您可以免費復制和分發該規范,並進行衍生工作,而且可以自由地用於商業工作。一個咨詢委員會負責更新規范、推廣規范和編寫文檔。
RSS 文件形式
RSS 文件由一個 <channel> 元素及其子元素組成。除了頻道內容本身之外, <channel> 還以項的形式包含表示頻道元數據的元素 —— 比如 <title> 、 <link> 和 <description> 。項通常是頻道的主要部分,包含經常變化的內容。
頻道
頻道一般有三個元素,提供關於頻道本身的信息:
<title> : 頻道或提要的名稱。
<link> : 與該頻道關聯的 Web 站點或者站點區域的 URL。
<description> : 簡要介紹該頻道是做什麼的。
許多頻道子元素都是可選的。常用的 <image> 元素包含三個必需的子元素:
<url> : 表示該頻道的 GIF、JPEG 或 PNG 圖像的 URL。
<title> : 圖象的描述。當頻道以 HTML 呈現時,用作 Html <image> 標簽的 ALT 屬性。
<link> : 站點的 URL。如果頻道以 Html 呈現,該圖像作為到這個站點的鏈接。
<image> 還有三個可選的子元素:
<width> : 數字,表示圖象的像素寬度,最大值是 188,默認值為 88。
<height> : 數字,表示圖象的像素高度。最大值是 400,默認值為 31。
<description> : 包含文本,在呈現時可以作為圍繞著該圖像形成的鏈接元素的 title 屬性。
此外還可以使用許多其他可選的頻道元素。多數都是不言自明的:
<language> : en-us
<copyright> : Copyright 2003, James Lewin
<managingEditor> : dan@spam_me.com (Dan Deletekey)
<webMaster> : dan@spam_me.com (Dan Deletekey)
<pubDate> : Sat, 15 Nov 2003 0:00:01 GMT
<lastBuildDate> : Sat, 15 Nov 2003 0:00:01 GMT
<category> : ebusiness
<generator> : Your CMS 2.0
<docs> : http://blogs.law.harvard.edu/tech/rss
<cloud> : 允許進程注冊為“cloud”,頻道更新時通知它,為 RSS 提要實現了一種輕量級的發布-訂閱協議。
<ttl> : 存活時間是一個數字,表示提要在刷新之前緩沖的分鐘數。
<rating> : 關於該頻道的 PICS 評價。
<textInput> : 定義可與頻道一起顯示的輸入框。
<skipHours> : 告訴聚集器哪些小時的更新可以忽略。
<skipDays> : 告訴聚集器那一天的更新可以忽略。
項
項通常是提要中最重要的部分。每個項都可以關於某個 weblog、完整文檔、電影評論、分類廣告或者任何希望與頻道連鎖的內容的記錄。頻道中的其他元素可能不變,但項經常發生變化。
您可以有任意多個項。以前的規范限值為 15 個項,如果要保持向後兼容這仍然是一個很好的上限。
新聞項的元素
每個項通常包含三個元素:
<title> : 這是項的名稱,在標准應用中被轉換成 Html 中的標題。
<link> : 這是該項的 URL。title 通常作為一個鏈接,指向包含在 <link> 元素中的 URL。
<description> : 通常作為 link 中所指向的 URL 的摘要或者補充。
所有的元素都是可選的,但是一個項至少 要麼 包含一個 <title> ,要麼包含一個 <description> 。
項還有其他一些可選的元素:
<author> : 作者的 e-mail 地址。
<category> : 支持有組織的記錄。
<comments>: 關於項的注釋頁的 URL。
<enclosure> : 支持和該項有關的媒體對象。
<guid> : 唯一與該項聯系在一起的永久性鏈接。
<pubDate>: 該項是什麼時候發布的。
<source> : 該項來自哪個 RSS 頻道,當把項聚合在一起時非常有用。
清單 1 是一個 RSS 2.0 文件的例子。注意,頻道包含在 <rss version="2.0"> 中。這是一個非常基本的例子,說明了項和圖像如何包含在頻道中。所示的元素都是最常用的頻道子元素。
清單 1. 示例 RSS 2.0 文件<?XML version="1.0"?>
<rss version="2.0">
<channel>
<title>The channel's name goes here</title>
<link>/School/UploadFiles_7810/201103/20110327132724410.gif</url>
<link>http://www.urlofthechannel.com/</link>
</image>
<item>
<title>The Future of content</title>
<link>http://www.itworld.com/nl/ecom_in_act/11122003/</link>
<description> The issue of people distributing and reusing
digital media is a problem for many businesses. It may also be
a hidden opportunity. Just as open source licensing has opened
up new possibilitIEs in the world of technology, it promises to do
the same in the area of creative content.</description>
</item>
<item>
<title>Online Music Services - Better than free?</title>
<link>http://www.itworld.com/nl/ecom_in_act/08202003/</link>
<description>More people than ever are downloading music from
the Internet. Many use person-to-person file sharing programs like
Kazaa to share and download music in MP3 format, paying nothing.
This has made it difficult for companIEs to setup online music
businesses. How can companIEs compete against free?</description>
</item>
</channel>
</rss>
相關工具
由於 RSS 的普及,出現了許多工具,使您能夠基本上在任何環境中使用這些文件:
Java 技術:可在 Sun 站點上找到的一個 RSS UtilitIEs Package,支持在 JavaServer Pages 中使用 Tag Library。它還包括一個 RSS 解析器。
Perl:已經有幾種 Perl 工具處理 RSS。XML::RSS 提供了創建和維護 RSS 文件的一個框架。它支持在常用版本之間的轉換。
Python:RSS.py 是一組通過 Python 使用 RSS 頻道的類。
此外,許多內容管理和 weblog 工具也直接支持 RSS。多數 weblog 工具,包括 Movable Type、Blogger 和 Radio Userland 都支持 RSS。一些內容管理系統,包括 Zope 和 CityDesk 現在也支持它了。
擴展 RSS
RSS 2.0 有許多可選元素,包括多數頻道都需要的那些元素。但是它還支持擴展性,因此您可以使用規范中沒有的元素。不過,RSS 2.0 規范並沒有花費多少時間定義如何實現擴展。關於擴展性,規范中總結為:“RSS 提要可以包含本頁中沒有描述的元素,只要這些元素定義在一個名稱空間中。”
這就留下了很大的想像空間!所幸的是,規范中包含一個例子,您可以參考目前使用的幾個例子。
基本的思想是您可以增加需要的標簽 —— 但是,增加帶有多種含義的元素太容易了。使用您的頻道的人們可能並不知道某個標簽是什麼含義。比如,如果我要在一個頻道中使用 <analog> 標簽,它的含義就不很清楚。Web 專家可能認為這個標簽指的是 Analog,它是最流行的 Web log 文件分析器。科幻迷可能認為這個標簽是關於 Analog 的,一本經典的科幻雜志。音樂家可能認為它指的是流行的合成器類型,生物學家認為這是一種器官,電子工程師認為是一種電路。含糊性使人們很難理解標簽的含義。
因此,RSS 允許您增加所喜歡的任何標簽,但是要求必須和名稱空間一起使用。這樣有助於澄清標簽的含義。
再回到 <analog> 的例子,我可能希望創建一組關於電子商務的標簽,並讓 <analog> 標簽作為一個“e-business”元素。為此,我增加如下的名稱空間:
XMLns:ebusiness="http://www.lewingroup.com/ebusinessChannel"
這就創建了一個名為“ebusiness”的名稱空間,並表明這個名稱空間的文檔在我的站點上。為了使用 <analog> 標簽,我可以使用這種格式: <ebusiness:analog> 。這樣就能與其他類似的含義中區分開來,比如 <scIEncefiction:analog> 或 <synthesizers:analog> 。
關於擴展性,一個更實際的例子可以在 RSS 2.0 規范的示例文件中找到:
清單 2. RSS 2.0 規范示例文件中的名稱空間<?XML version="1.0"?>
<!-- RSS generated by Radio UserLand v8.0.5 on 9/30/2002; 4:00:00 AM Pacific -->
<rss version="2.0" XMLns:blogChannel="http://backend.userland.com/blogChannelModule">
<channel>
<title>Scripting News</title>
<link>http://www.scripting.com/</link>
<description>A weblog about scripting and stuff like that.</description>
<language>en-us</language>
<blogChannel:blogRoll>
http://radio.weblogs.com/0001015/userland/scriptingNewsLeftLinks.opml
</blogChannel:blogRoll>
<item>
<description>Joshua Allen:
<a href="http://www.Netcrucible.com/blog/2002/09/29.Html#a243">
Who loves namespaces?</a></description>
<pubDate>Sun, 29 Sep 2002 19:59:01 GMT</pubDate>
<guid>
http://scriptingnews.userland.com/backissues/2002/09/29#When:12:59:01PM
</guid>
</item>
</channel>
</rss>
在這個例子中,定義了一個稱為 blogChannel 的名稱空間。它指向一個文檔,該文檔解釋了幾種常見於 weblog 的新元素的用法。其中之一是 <blogroll> 。文檔說明,blogroll 是 weblog 中的一個鏈接集合,指向與您的 weblog 內容相關的站點。
<blogChannel:blogRoll> 標簽提供了用戶或軟件所需要的信息,知道 blogRoll 是一個定義在 blogChannel 名稱空間中的元素,而且可以找到這個文檔的位置。
同樣,RSS 2.0 只對 不屬於規范的元素要求名稱空間。所有的基本標簽都假定在 RSS 2.0 名稱空間中。這使得這種格式更容易使用,因為除非需要擴展 RSS,否則您完全不需要知道名稱空間。
結束語
本文考察了 RSS 在內容連鎖和聚合領域的重要性。文章主要討論 RSS 2.0,因為這是最新的規范版本,而且正在迅速普及。本文也考察了處理 RSS 可以使用的工具,包括集聚器、驗證程序和解析器。