RSS 和 Atom 技術的出現為新聞聯合(news syndication)帶來了一個嶄新的時代。不管怎樣,Web 網站管理員每天手動發布新聞並管理電子郵件使用者都需要花費時間。本文說明了如何使用 RSS 和 Atom 同步發佈格式實現通用的新聞發布體繫結構,使發布過程變得輕鬆,並將人為錯誤減至最少。
RSS 和 Atom 聯合
RSS 和 Atom 是相似的基於 XML 的文檔格式,描述被稱為摘要(feed)的相關資訊列表。這些摘要由許多項組成,每項都帶有一套可擴充的附加中繼資料;例如,每項都有一個標題。這些摘要的主要用途是用於 Web 內容聯合,比如用於 Web 網站和直接用於使用者代理程式的 Weblog 或者新聞標題。
RSS 2.0 和 Atom 1.0 的兩個例子
清單1. RSS 2.0 摘要樣本
<?xml version="1.0"?> <rss version="2.0"> <channel> <title>Feed Title</title> <link>http://yourwebsite.com/</link> <description>Feed Description</description> <language>en-us</language> <pubDate>Mon, 03 Jan 2005 12:00:00 GMT</pubDate> <item> <title>Article Title</title> <link>http://yourwebsite.com/articlelink.html</link> <description>Your content included here.</description> </item> <item> <title>Sports</title> <link>http://yourwebsite.com/sportslink.html</link> <description>Your content included here.</description> </item> </channel> </rss> |
清單2. Atom 1.0 feed 樣本
<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title> Feed Title </title> <link href=" http://yourwebsite.com/"/> <updated>2003-12-13T18:30:02Z</updated> <author> <name>Your Name</name> </author> <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id> <entry> <title>Article Title</title> <link href=" http://yourwebsite.com/articlelink.html "/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary> </entry> <entry> <title>Sports</title> <link href=" http://yourwebsite.com/sportslink.html "/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344e45ab90</id> <updated>2003-12-14T13:30:55Z</updated> <summary>Some text.</summary> </entry> </feed> |
RSS 和 Atom 摘要的相似點
從前面的兩個例子(清單 1 和 清單 2)可以看出,RSS 和 Atom 具有相似的基於 XML 的格式。它們的基本結構是相同的,只在節點的運算式上有一點區別。
每個摘要檔案實際上代表一個通道。它包含通道標題、連結、描述、作者等等。通道資訊提供關於摘要的基本資料。通道資訊之後是一些項。每項代表一篇可以從摘要閱讀器閱讀的真實的新聞或者文章。通常情況下,每項包含有標題、連結、更新時間和摘要資訊。
RSS 和 Atom 摘要的不同點
參考 RSS 2.0 and Atom 1.0, Compared,回顧 RSS 和 Atom 的不同點。
表 1. 比較 RSS 2.0 和 Atom 1.0
| 不同點 |
RSS 2.0 |
Atom 1.0 |
| 部署 |
RSS 2.0 得到廣泛部署。 |
Atom 1.0 還未得到廣泛部署。 |
| 規範 |
哈佛大學擁有著作權並凍結了 RSS 2.0 規範。 |
Atompub 工作群組(屬於 IETF)就 Atom 1.0 規範達成一致意見,並在將來有可能重新修訂。 |
| 所需內容 |
RSS 2.0 包含所需的摘要層級的標題、連結和描述。它不需要在摘要中出現的任何單獨項的欄位。 |
Atom 1.0 包含摘要和條目所需的標題(可以為空白)、惟一標識和最後更新的時間戳記。 |
| 承載(payload) |
RSS 2.0 可以包含普通文本或者轉義 HTML,但是不能分辨所提供的是兩個中的哪一個。 |
Atom 1.0 包含承載容器。 |
| 全部或者部分內容 |
RSS 2.0 有一個 <description> 元素,可以包含條目的全部文本或者大綱。它沒有用於標識內容是否完全的內建方法。 |
Atom 1.0 提供單獨的 <summary> 和 <content> 元素。如果它是非文本的或者非本地的內容,出於可訪問性的原因摘要將很好用。 |
| 自動探索 |
RSS 2.0 用不同的方法實現自動探索。 |
Atom 1.0 標準化自動探索。 |
| 提取和彙總 |
RSS 2.0 只有一個可識別的形式:一個 <rss> 文檔。 |
Atom 1.0 允許獨立的 Atom Entry 文檔,可以使用任何網路通訊協定傳輸;例如,XMPP。Atom 也支援彙總摘要,其中,條目指向它們來自的摘要,前提是如果它們將被包含到其他摘要中。 |
RSS 和 Atom 發布系統的通用體繫結構
隨著 RSS 和 Atom 格式規範的發展和完善,可以實現越來越多的 Web 應用程式。使用 RSS 或 Atom 的最通用和典型的實現是新聞發布系統。
以下是一個使用 RSS 和 ATOM 摘要實現發布系統的通用體繫結構。這個體繫結構由三部分組成:
現在分別看一下這三個子系統的詳細內容。
摘要產生器
摘要產生器負責產生基於 XML 的摘要檔案。摘要產生器的類圖如下所示:
圖 1. 摘要產生器的類圖
摘要產生器的核心是 FeedFileManager 類。它產生與一個特定摘要相關的 XML 檔案。摘要有兩種具體的類型:AtomFeed 和 RssFeed。這兩種 feed 類都包含一個 feed channel 類和一個 feed item 類。feed channel 類和 feed item 類的實現將根據它們不同的構造而不同。
摘要運行子系統
摘要運行子系統提供了幾個摘要運行函數,用於運行這兩種類型的摘要檔案。例如,insertItem()、deleteItem()、updateItem() 函數。摘要運行子系統的類圖如下所示:
圖 2. 摘要運行子系統的類圖
首先,需要一個抽象原廠模式 PublisherFactory 產生兩個摘要發行者之一。然後這個發行者通過 DataCollection 類從資料庫中提取資料。
自動發布子系統
自動發布子系統是在固定時間更新摘要檔案的計時器。它利用前面兩個子系統並使發布系統運行。
圖 3. 自動發布子系統的類圖
自動產生 RSS 和 ATOM 摘要的逐步實現
現在,來看看每一步的詳細實現過程。首先,圖 4 提供了通用實現過程的圖表。它顯示了幾個主要的構建塊以及它們之間的關係。
圖 4. 實現過程概覽
整個應用程式是一個大計時器,所以可以在它內部設定固定的啟動時間。當時間一到,計時器開始做預定的工作 —— 產生摘要檔案。首先,應用程式產生一個 XML 檔案,然後形成 RSS 和 Atom 摘要,最後向建立的 XML 檔案中寫入這些摘要。摘要的來源可以是資料庫、檔案或者各種其他的資源。
計時器
計時器是發布系統的核心。它觸發系統根據使用者的指定時間或者在每天的固定時間產生摘要檔案。對於 Java 應用程式,通常可以使用 Java 標準調度類:Timer 和 TimerTask 來實現一個重複執行的調度任務。
更一般的是在這個發布系統中組合調度迴圈任務。如何組合調度迴圈任務的詳細資料可以參考 在 Java 應用程式中計劃重複執行的任務。
清單 3. Timer start 方法樣本
public void start() { SchedulerTask st = new SchedulerTask(){ public void run() { try { updateNewsFeeds(); //concrete method of update feed files. updateBooksFeeds(); ... } catch (Exception e) { e.printStackTrace(); } } }; |
產生基於 XML 的摘要檔案
RSS 和 ATOM 摘要都是基於 XML 的,所以在實現過程中產生這些基於 XML 的檔案是很重要的。在摘要產生器子系統中的 FeedFileManager 類負責這項任務。
圖 5. FeedFileManager 類
通常,這個類應該包括 createFeedFile() 方法。這個方法需要做三件事:
- 建立一個 XML 檔案。要達到這個目標,可以建立一個靜態方法 createXMLFile()。
- 與 “摘要運行子系統” 進行互動來建立相關通道和項資訊。
- 把所有資訊寫回 XML 檔案。
清單 4. createFeedFile 方法樣本
public String createFeedFile(String channelid, String name, String type) throws Exception { ... createXMLFile(file, type); IPublishable publisher = PublisherFactory.createPublisher(type, file); Feed feed = getFeed(type); Channel channel = feed.getChannel(); ArrayList itemlist = feed.getItemList(); publisher.insertChannel(channel); publisher.insertItemList(itemlist); publisher.writeback(file); return file; } |
形成 RSS/Atom 摘要
在上一個過程中,發布工廠建立了一個發行者並向某一摘要插入相關的通道資訊和項列表。
清單 5. 插入通道和項列表的範例程式碼
publisher.insertChannel(channel); publisher.insertItemList(itemlist); |
要形成精確的通道和項列表,就要從資料庫中取出資料並向摘要模式中輸入取出的資料。下面示範了如何取出資料,然後向相關 databean 中輸入資訊:
清單 6. 摘要的範例程式碼
... NewsBeanManager newsmanager = new NewsBeanManager(); newslist = newsmanager.getAllNews(); //interact with database ... for (Iterator it = newslist.iterator(); it.hasNext(); it.next()) { title = "News " + i + ": " + ((NewsBean) newslist.get(i)).getTitle(); link = ((NewsBean) newslist.get(i)).getLink(); author = ((NewsBean) newslist.get(i)).getAuthor(); timestamp = ((NewsBean) newslist.get(i)).getPublishTime(); id = String.valueOf(((NewsBean) newslist.get(i)).getNewsID()); description = ((NewsBean) newslist.get(i)).getSummary(); content = ((NewsBean) newslist.get(i)).getContent(); rssitem = new RssItem(title, link, author, timestamp, id, description); rssitemlist.add(i, rssitem); atomitem = new AtomItem(title, link, author, timestamp, id, description, content); atomitemlist.add(i, atomitem); i++; } |
實現技巧
在成功地實現新聞發布系統之後,您可能會受益於以下的部署技巧。
為最流行的摘要閱讀器實現 RSS 或者 Atom 摘要
要滿足最流行的摘要閱讀器的需要,在產生摘要檔案時要注意以下幾點。
清單 8. 為通道提供連結資訊的範例程式碼
<?xml version="1.0" encoding="utf-8" ??> <rss?> <channel?> <title?>News Syndication</title?> <link?>http://www.newssyndication.com</link?> <description?>this is a news feed</description?> ... <?xml version="1.0" encoding="utf-8" ??> <feed xmlns="http://www.w3.org/2005/Atom"?> <title?>News Syndication</title> <link href="http://www.newssyndication.com" /?> <updated?>2006-07-06T10:26:30Z</updated?> <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id?> |
在產生 XML 檔案時支援全球化
在 XML 檔案頭中添加編碼資訊。
清單 9. 在 XML 檔案頭中添加編碼資訊的範例程式碼
<?xml version="1.0" encoding="utf-8"?> |
當實現寫 XML 檔案的函數時,使用 OutputStreamWriter 代替 FileWriter 把編碼設定為 utf-8。FileWriter 的預設編碼是 “GBK”。
清單 10. 使用 OutputStreamWriter 把編碼設定為 utf-8 的範例程式碼
OutputStreamWriter writer = new OutputStreamWriter(outputstream,"utf-8"); |
結束語
本文中,首先回顧了 RSS 和 Atom 摘要的相似點和不同點,然後考察了使用兩種摘要類型實現發布系統的體繫結構。這種體繫結構包括三個子系統,彼此相互配合工作。接下來在逐步示範之後,向您介紹了一些實現過程的技巧。現在您可以享受在新聞摘要中應用這些高效方法了。
參考資料
學習
- 您可以參閱本文在 developerWorks 全球網站上的 英文原文 。
- 什麼是 Atom?:Atom 的快速入門。
- RSS 2.0 and ATOM 1.0, Compared:關於 RSS 2.0 和 Atom 1.0 之間的區別的詳細資料。
- RSS 2.0 規範:學習整個規範。
- RSS and Atom feed:在深入研究 developerWorks 網站之後,構建自己的 RSS 和 Atom 摘要。
- RSS 教程:學習 RSS 是什麼、如何開始以及如何使用它。
- Workplace RSS feed and blog:從 Workplace 討論論壇、Workplace 產品支援頁面、developerWorks Workplace 文章和 developerWorks Workplace 教程中獲得最新內容。
- 在 Java 應用程式中計劃重複執行的任務(Tom White,developerWorks,2003 年 11 月):閱讀關於 Java 語言中
Timer 類的總結。
- developerWorks Web 開發專區:關於 Web 技術的文章和教程可以提升您的網站開發技能。
- developerWorks 技術事件和網路廣播:關注和瞭解技術的最新發展,縮短學習進程,改進最困難的軟體項目的品質和結果。
原文地址:http://www-128.ibm.com/developerworks/cn/web/wa-syndrssatom/index.html?ca=drs-#listing1