RSS 簡單卻並不有限
RSS 這個縮寫詞有很多含義:真正簡單的聯合(Really Simple Syndication)、豐富站點摘要(Rich Site Summary)、RDF 站點摘要( RDF Site Summary),可能還有其他的說法。實際上,RSS 就是在越來越多的網站(包括 developerWorks)上出現的那個桔紅色按鈕。
通過 RSS 提要可以訂閱站點並在更新的時候得到通知。RSS 和電子郵件訂閱有兩個重要的區別:
RSS 需要特定的客戶機,即 RSS 閱讀器,不過將逐漸包括到 Web 浏覽器中。
RSS 保護用戶的秘密,與電子郵件不同,不用在站點上交換個人信息。
RSS 101
編寫您的第一個 RSS 文件再簡單不過了。根 RSS 元素稱為 rss(非常合適)。後面緊跟著的是 channel 元素。
channel 元素首先包含關於新聞提要的描述。它至少要包括一個提要標題(title)、到相關網站的鏈接(link)和提要描述(description)。
其他元素是可選的。最常用的有提要語言(language)、發布日期(pubDate)、分類(category)和有效期(ttl),即頻道緩存的分鐘數。
經常還會包括 docs 元素,這個元素有點特殊。docs 元素指向 RSS 文檔,因此必須與每個 RSS 文檔的值相同。
頻道描述之後是一個 item 元素列表,每項代表一個新聞事件。
什麼稱得上新聞?這取決於站點和應用程序。對於一般的網站,項(item)可能表示頁面的一次重要更新;對於播客(podcast),就是一段新的插話;對於網絡監控應用程序,就是一次網絡警報;對於論壇,就是一個新的帖子。
item 的內容與頻道本身類似:title、link 和 description。可能有更詳細的日期、到多媒體內容的鏈接(enclosure)、來源和注釋。
要在描述中包含 Html 標記必須對其進行轉義(通常使用 CDATA 節)。
值得注意的是 guid 元素,一個特殊的標識符。表示的時候,RSS 依靠它標識新的項。如果沒有 GUID,閱讀器必須比較項標題和內容來查找新的項。
清單 1 給出了 RSS 提要的一個例子:
清單 1. RSS 提要
<rss version="2.0">
<channel>
<title>Marchal.com</title>
<link>http://www.marchal.com/</link>
<description>Marchal's site.</description>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<language>en</language>
<copyright>Copyright 2006, Benoit Marchal.</copyright>
<pubDate>Fri, 30 Jun 2006 00:35:40 +0200</pubDate>
<item>
<title>Online photos</title>
<link>http://www.marchal.com/en/photos</link>
<description><![CDATA[<p>In 2002 I added a digital camera to my
writer toolbox. I have used it to illustrate my articles and web
sites.</p>
<p>While I had some experIEnce with film-based photos, I was
new to digital images. Most of the things I knew were
still valid, others I had to re-learn. There was
a lot of new material as well. These pages summarize
my findings.</p>]]></description>
<pubDate>Fri, 30 Jun 2006 00:35:40 +0200</pubDate>
<category>photo</category>
<category>2002</category>
<guid isPermaLink="false">photos</guid>
</item>
</channel>
</rss>
為了訂閱提要,訪問者需要一個 RSS 閱讀器。簡言之,閱讀器定期下載 RSS 文件,如果發現新項就通知用戶。
兩種主流浏覽器中內置了 RSS 閱讀器:Firefox 1.5、Internet Explorer 7,Safari 也帶有一個 RSS 閱讀器。還有獨立的閱讀器,比如 NewsGator 的閱讀器。此外,對於那些不喜歡安裝新軟件的人來說,可以通過聚合站點(如 Google Reader 和 NetVibes)閱讀提要。甚至還有 RSS 和電子郵件之間的橋梁,如 Zookoda。
除了本節所述的之外,RSS 還定義了其他元素。
RSS 的能力
一句話,需要共享信息或者通知用戶的宿主應用程序或網站能夠從 RSS 提要中獲益。事實上,RSS 的應用像野火一樣蔓延得很快。
大量的應用也帶來了一些問題。一些開發人員抱怨說不得不把概念硬塞進項中,而後者的局限性太大。為了解決這種局限性,RSS 2.0 被設計成了一種可擴展的語言。規則很簡單:RSS 元素本身沒有名稱空間(與 RSS 0.92 保持向後兼容),但是允許開發人員在自己的名稱空間增加元素來擴展 RSS。
如果標記具有名稱空間,RSS 閱讀器就會嘗試根據名稱空間識別出擴展來。如果成功就能處理這些元素。否則簡單地忽略這些元素。
因此,RSS 提供了一個基礎,可以建立更強大的應用程序。這種機制的優點在於,對閱讀器來說擴展是可選的,不能處理某個擴展的閱讀器仍然可以有效地處理核心 RSS 規范。
關於名稱空間的說明
在繼續後面的討論之前,我先來揭穿關於名稱空間的一些神話。奇怪的是,W3C 發布名稱空間推薦標准七年之後,仍然存在著很多誤解,而且不幸的是,還體現在一些 RSS 閱讀器沒有正確地實現標准。
名稱空間是為需要在一個核心元素集上擴展的詞匯表設計的,比如 RSS。具體而言,如果兩個不同的擴展使用意義有別的同一個 XML 元素,名稱空間可以防止名稱沖突。
由於擴展是獨立開發的,出現重復使用的名稱只是一個時間問題。比如 “key” 這個詞。它可能是數據庫中的鍵,也可能是加密中的密鑰。
為了消除歧義,名稱空間 將元素名分為本地名和名稱空間統一資源標識符(URI)。名稱空間 URI 是擴展的惟一標識符。就其自身而言,本地名不能保證是惟一的,但本地名和名稱空間 URI 結合起來可以做到。
我假設大部分讀者都熟悉名稱空間的語法。簡單地說,XMLns 屬性聲明一個前綴並將其和名稱空間 URI 聯系起來。然後前綴又把名稱空間 URI 和本地名聯系起來。本地名和前綴之間使用冒號作為分隔符。清單 2 是一個例子:
清單 2. 名稱空間聲明
<dc:contributor XMLns:dc="http://purl.org/dc/elements/1.1/">
Marchal</dc:contributor>
實際上,名稱空間有兩點容易造成混亂:
標識符是 URI 而且多數時候就是一個 URL。
前綴和本地名的組合不能保證是惟一的。只有名稱空間 URI 才能保證惟一性。
我將說明如何解決這兩種錯誤。
首先,名稱空間 URI。對於名稱空間而言,URI 是嚴格的詞匯表標識符而不是定義。因此,URI 指向何處沒有關系。很多情況下,指向的源甚至不存在。
開發人員和用戶雖然喜歡定義,但是他們認為在處理給定名稱空間中的元素之前迫使應用程序下載文件是不能接受的。
很多應用程序在運行時仍然沒有穩定的 Internet 連接。即便有 Internet 連接,下載文件會降低其速度,這一點也不總是允許的。況且如果網站(暫時)不能用怎麼辦?
此外,對於名稱空間來說,需要的僅僅是一個標識符。
為什麼用前綴呢?在每個標記上添上 URI 會增加文檔的長度。於是引入了前綴作為縮短 URI 的一種辦法。但是,前綴不能保證是惟一的(如果本地名不能保證這一點,有什麼理由相信前綴會是惟一的,尤其是給出的前綴通常很短),所以必須引用 URI。
這就引出了 URI 的特殊性質,它們可作為惟一的標識符是因為大部分 URI 是 URL,而 URL 包含域名。只要使用自己擁有的域名定義名稱空間就能保證惟一性,因為沒有其他組織注冊同一個域。
三種流行的擴展
為了具體了解擴展的工作原理,我們來看看三種常見的 RSS 擴展:
用於元數據的 Dublin Core
用於播客的 iTunes
擴展了擴展的 Syndicated Photography
Dublin Core
Dublin Core 是一組元數據元素,最早是 RFC2413 定義的。Dublin Core 是資源搜索的最小元數據集。已經被用於 Html(META 元素中)和各種 XML 詞匯表。
Dublin Core 中的一些元素與 RSS 元素相同(比如 language),這是不可避免的,因為它是在 RSS 之前誕生的。但是這些重復也很有用,因為可以在頻道或項上增加 Dublin Core 擴展。比如,RSS copyright 元素只能出現在頻道層,但是可以把 Dublin Core rights 附加到每個項上。
Dublin Core 名稱空間是 http://purl.org/dc/elements/1.1/。
清單 3 中的例子在 RSS 中使用了 Dublin Core:
清單 3. RSS 中的 Dublin Core
<rss version="2.0" XMLns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Marchal</title>
<link>http://www.marchal.com/</link>
<description>Personal site.</description>
<language>en</language>
<item>>
<title>Introduction</title>
<link>http://www.marchal.com/en/</link>
<description>Introduction to the site.</description>
<dc:creator>Marchal</dc:creator>
<dc:rights>Copyright 2001-2004 Marchal</dc:rights>
</item>
</channel>
</rss>
Dublin Core 擴展表明即使與 RSS 類似的元素也有自身的價值,可以提供更多的選擇。
iTunes Music Store
iTunes 通過其 iTunes Music Store 提供了對播客的直接訪問。為了在存儲中集成播客,iTunes 用名稱空間 http://www.itunes.com/dtds/podcast-1.0.dtd 定義了一個擴展。
iTunes 擴展非常值得注意,因為:
在定義不同的時候,它沒有逃避重新定義與 RSS 類似的元素(比如 itunes:image,iTunes 需要 300×300 像素的圖像,而 RSS 規定最大寬度為 144)。
定義了新元素來增強用戶的可訪問性(比如 itunes:duration 提供了播客的播放時間,而 RSS 只提供了文件長度)。
清單 4 中的 RSS 例子使用了 iTunes 擴展:
清單 4. 帶有 iTunes 擴展的 RSS 提要
<rss XMLns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
version="2.0">
<channel>
<title>Declencheur</title>
<link>http://www.declencheur.com/</link>
<description>Le podcast qui parle photos</description>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<language>fr</language>
<copyright>? 2006, Benoit Marchal. Tous droits reserves.</copyright>
<pubDate>Wed, 24 May 2006 16:19:39 +0200</pubDate>
<itunes:author>Benoit Marchal</itunes:author>
<itunes:image href="http://www.declencheur.com/clic/medias/2006/dsc_7478.jpg"/>
<itunes:category text="Arts & Entertainment">
<itunes:category text="Photography"/>
</itunes:category>
<itunes:category text="International">
<itunes:category text="French"/>
<itunes:category text="Belgian"/>
</itunes:category>
<item>
<title>Histogramme</title>
<link>http://www.declencheur.com/clic/archives/2006/05/histogramme-visuel</link>
<description><![CDATA[<p><img alt="L'histogramme" height="225"
width="150" align="right" class="photo illustrationright"
src="http://www.declencheur.com/clic/medias/2006/_dsc1808.jpg" />A mes yeux,
l'histogramme est un des progres les plus remarquables de la photographIE sur
les dix dernIEres annees. Un progres dans la precision de l'exposition au moins
aussi important que la mesure matricIElle en son temps.</p>
<p>Les trois segments de l'episode sont (entre parentheses, le debut du
segment concerne) :</p>
<ol><li>(01:34) Elinchrom D-Lite, je suis particulIErement enthousiaste
par l'arrivee de ces Flashes electroniques de studio. Mes Premieres
impressions.</li>
<li>(07:40) Histogramme, le theme principal de l'episode. Un
<a href="http://www.declencheur.com/clic/medias/2006/decl-2006-05-13.pdf"
target="_blank">complement visuel</a> est disponible.</li>
<li>(27:03) Vos commentaires, mes reactions : conseils pour la sauvegarde
et precisions sur l'impression jet d'encre. Merci de votre
soutIEn !</li></ol>
<p>Les lIEns presentes dans l'episode :</p>
<ul><li><a href="http://www.elinchrom.com"
target="_blank">Elinchrom</a></li>
<li><a href="http://www.foto-mueller.at" target="_blank">Foto
Mueller</a><br clear="right" /></li></ul>]]></description>
<pubDate>Mon, 15 May 2006 00:21:13 +0200</pubDate>
<category>numerique</category>
<category>technique</category>
<enclosure length="34722926" type="audio/mpeg"
url="http://www.declencheur.com/clic/medias/2006/decl-2006-05-14.mp3" />
<guid isPermaLink="false">histogramme</guid>
<itunes:duration>36:08</itunes:duration>
</item>
</channel>
</rss>
Syndicated Photography
Photocasting 意思是通過 RSS 提要分發照片。它與播客的原理相似,但傳播的是圖像而不是聲音。初看起來,要用 RSS 提要分發照片,似乎使用 enclosure 元素就足夠了。
聰明的照片浏覽者首先下載縮略圖,然後只下載用戶請求的照片。但這不是 enclosure 的行為方式,因此 Pheed 只得定義包含這兩個標記的擴展:photo:thumbnail(下載快的小圖像)和 photo:imgsrc(完整的圖像)。Pheed 是一個 RSS 聚合程序,為多媒體文檔如圖像提供了專門的支持。
有趣的是,照片也需要元數據,於是 Pheed 選擇了 Dublin Core。因此,照片擴展建立在另一個擴展的基礎上。避免了重復勞動因而提高了效率。
清單 5 是照片提要的一個例子。要注意其中聲明了兩個名稱空間:
清單 5. 帶有 Syndicated Photography 擴展的 RSS 提要
<?XML version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" XMLns:photo="http://www.pheed.com/pheed/"
XMLns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Fun with photos</title>
<link>http://www.marchal.com/en/photos/</link>
<description>Photo humor.</description>
<language>en</language>
<item>
<title>Journalist</title>
<link>http://www.marchal.com/en/photos/humour</link>
<description>He needs to fly</description>
<dc:creator>Marchal</dc:creator>
<dc:rights>Copyright 2004 Marchal</dc:rights>
<dc:format>digital</dc:format>
<dc:subject>Lego humor</dc:subject>
<photo:imgsrc>
http://www.marchal.com/en/photos/humour/phbd0001.jpg
</photo:imgsrc>
<photo:thumbnail>
http://www.marchal.com/images/shared/thbd0001.jpg
</photo:thumbnail>
</item>
</channel>
</rss>
定義自己的擴展
如果發現希望 RSS 再增加一項功能該怎麼辦?
要確保還不存在您需要的擴展。不要重新發明輪子,這會給 RSS 閱讀器帶來痛苦。
如果發現仍然需要開發自己的擴展,一定要遵循正確使用名稱空間的規則。
如果根本不合適,不要害怕重新定義已有的元素(比如 itunes:image 與 RSS 自己的 image 雖然類似但不相同)。超負荷使用元素只能造成混亂。
RSS 是一種靈活的格式,但更重要的是,它可以作為很多需要廣播或窄播(narrowcast)的應用程序的基礎。感謝擴展機制,它的用處簡直太大了。