2006 年 10 月 23 日
RSS 和 Atom 技術(shù)的出現為新聞聯(lián)合(news syndication)帶來(lái)了一個(gè)嶄新的時(shí)代。不管怎樣,Web 站點(diǎn)管理員每天手動(dòng)發(fā)布新聞并管理電子郵件用戶(hù)都需要花費時(shí)間。本文說(shuō)明了如何使用 RSS 和 Atom 聯(lián)合格式實(shí)現通用的新聞發(fā)布體系結構,使發(fā)布過(guò)程變得輕松,并將人為錯誤減至最少。
如果您對內容發(fā)布、RSS 2.0 格式規范以及 Atom 1.0 格式規范有了基本了解,那么您就可以準備使用其中之一或者使用兩種技術(shù)來(lái)實(shí)現新聞聯(lián)合系統,而本文對您來(lái)說(shuō)是一個(gè)便利快捷的參考資料。
RSS 和 Atom 是相似的基于 XML 的文檔格式,描述被稱(chēng)為摘要(feed)的相關(guān)信息列表。這些摘要由許多項組成,每項都帶有一套可擴展的附加元數據;例如,每項都有一個(gè)標題。這些摘要的主要用途是用于 Web 內容聯(lián)合,比如用于 Web 站點(diǎn)和直接用于用戶(hù)代理的 Weblog 或者新聞標題。
<?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> |
<?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> |
從前面的兩個(gè)例子(清單 1 和 清單 2)可以看出,RSS 和 Atom 具有相似的基于 XML 的格式。它們的基本結構是相同的,只在節點(diǎn)的表達式上有一點(diǎn)區別。
每個(gè)摘要文件實(shí)際上代表一個(gè)通道。它包含通道標題、鏈接、描述、作者等等。通道信息提供關(guān)于摘要的基本信息。通道信息之后是一些項。每項代表一篇可以從摘要閱讀器閱讀的真實(shí)的新聞或者文章。通常情況下,每項包含有標題、鏈接、更新時(shí)間和摘要信息。
參考 RSS 2.0 and Atom 1.0, Compared,回顧 RSS 和 Atom 的不同點(diǎn)。
| 不同點(diǎn) | RSS 2.0 | Atom 1.0 |
|---|---|---|
| 部署 | RSS 2.0 得到廣泛部署。 | Atom 1.0 還未得到廣泛部署。 |
| 規范 | 哈佛大學(xué)擁有版權并凍結了 RSS 2.0 規范。 | Atompub 工作組(屬于 IETF)就 Atom 1.0 規范達成一致意見(jiàn),并在將來(lái)有可能重新修訂。 |
| 所需內容 | RSS 2.0 包含所需的摘要級別的標題、鏈接和描述。它不需要在摘要中出現的任何單獨項的字段。 | Atom 1.0 包含摘要和條目所需的標題(可以為空)、惟一標識和最后更新的時(shí)間戳。 |
| 有效負載(payload) | RSS 2.0 可以包含普通文本或者轉義 HTML,但是不能分辨所提供的是兩個(gè)中的哪一個(gè)。 | Atom 1.0 包含有效負載容器。 |
| 全部或者部分內容 | RSS 2.0 有一個(gè) <description> 元素,可以包含條目的全部文本或者大綱。它沒(méi)有用于標識內容是否完全的內置方法。 | Atom 1.0 提供單獨的 <summary> 和 <content> 元素。如果它是非文本的或者非本地的內容,出于可訪(fǎng)問(wèn)性的原因摘要將很好用。 |
| 自動(dòng)發(fā)現 | RSS 2.0 用不同的方法實(shí)現自動(dòng)發(fā)現。 | Atom 1.0 標準化自動(dòng)發(fā)現。 |
| 提取和聚合 | RSS 2.0 只有一個(gè)可識別的形式:一個(gè) <rss> 文檔。 | Atom 1.0 允許獨立的 Atom Entry 文檔,可以使用任何網(wǎng)絡(luò )協(xié)議傳輸;例如,XMPP。Atom 也支持聚合摘要,其中,條目指向它們來(lái)自的摘要,前提是如果它們將被包含到其他摘要中。 |
隨著(zhù) RSS 和 Atom 格式規范的發(fā)展和完善,可以實(shí)現越來(lái)越多的 Web 應用程序。使用 RSS 或 Atom 的最通用和典型的實(shí)現是新聞發(fā)布系統。
以下是一個(gè)使用 RSS 和 ATOM 摘要實(shí)現發(fā)布系統的通用體系結構。這個(gè)體系結構由三部分組成:
現在分別看一下這三個(gè)子系統的詳細內容。
摘要生成器負責生成基于 XML 的摘要文件。摘要生成器的類(lèi)圖如下所示:

摘要生成器的核心是 FeedFileManager 類(lèi)。它生成與一個(gè)特定摘要相關(guān)的 XML 文件。摘要有兩種具體的類(lèi)型:AtomFeed 和 RssFeed。這兩種 feed 類(lèi)都包含一個(gè) feed channel 類(lèi)和一個(gè) feed item 類(lèi)。feed channel 類(lèi)和 feed item 類(lèi)的實(shí)現將根據它們不同的構造而不同。
摘要運行子系統提供了幾個(gè)摘要運行函數,用于運行這兩種類(lèi)型的摘要文件。例如,insertItem()、deleteItem()、updateItem() 函數。摘要運行子系統的類(lèi)圖如下所示:

首先,需要一個(gè)抽象工廠(chǎng)模式 PublisherFactory 生成兩個(gè)摘要發(fā)布者之一。然后這個(gè)發(fā)布者通過(guò) DataCollection 類(lèi)從數據庫中提取數據。
自動(dòng)發(fā)布子系統是在固定時(shí)間更新摘要文件的計時(shí)器。它利用前面兩個(gè)子系統并使發(fā)布系統運行。
圖 3. 自動(dòng)發(fā)布子系統的類(lèi)圖

![]() ![]() |
![]()
|
自動(dòng)生成 RSS 和 ATOM 摘要的逐步實(shí)現
現在,來(lái)看看每一步的詳細實(shí)現過(guò)程。首先,圖 4 提供了通用實(shí)現過(guò)程的圖表。它顯示了幾個(gè)主要的構建塊以及它們之間的關(guān)系。

整個(gè)應用程序是一個(gè)大計時(shí)器,所以可以在它內部設置固定的啟動(dòng)時(shí)間。當時(shí)間一到,計時(shí)器開(kāi)始做預定的工作 —— 生成摘要文件。首先,應用程序生成一個(gè) XML 文件,然后形成 RSS 和 Atom 摘要,最后向創(chuàng )建的 XML 文件中寫(xiě)入這些摘要。摘要的來(lái)源可以是數據庫、文件或者各種其他的資源。
計時(shí)器是發(fā)布系統的核心。它觸發(fā)系統根據用戶(hù)的指定時(shí)間或者在每天的固定時(shí)間生成摘要文件。對于 Java 應用程序,通??梢允褂?Java 標準調度類(lèi):Timer 和 TimerTask 來(lái)實(shí)現一個(gè)重復執行的調度任務(wù)。
更一般的是在這個(gè)發(fā)布系統中組合調度循環(huán)任務(wù)。如何組合調度循環(huán)任務(wù)的詳細信息可以參考 在 Java 應用程序中計劃重復執行的任務(wù)。
public void start() { SchedulerTask st = new SchedulerTask(){ public void run() { try { updateNewsFeeds(); //concrete method of update feed files. updateBooksFeeds(); ... } catch (Exception e) { e.printStackTrace(); } } }; |
RSS 和 ATOM 摘要都是基于 XML 的,所以在實(shí)現過(guò)程中生成這些基于 XML 的文件是很重要的。在摘要生成器子系統中的 FeedFileManager 類(lèi)負責這項任務(wù)。

通常,這個(gè)類(lèi)應該包括 createFeedFile() 方法。這個(gè)方法需要做三件事:
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; } |
在上一個(gè)過(guò)程中,發(fā)布工廠(chǎng)創(chuàng )建了一個(gè)發(fā)布者并向某一摘要插入相關(guān)的通道信息和項列表。
publisher.insertChannel(channel); publisher.insertItemList(itemlist); |
要形成精確的通道和項列表,就要從數據庫中取出數據并向摘要模式中輸入取出的數據。下面演示了如何取出數據,然后向相關(guān) databean 中輸入信息:
... 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++; } |
![]() ![]() |
![]()
|
在成功地實(shí)現新聞發(fā)布系統之后,您可能會(huì )受益于以下的部署技巧。
為最流行的摘要閱讀器實(shí)現 RSS 或者 Atom 摘要
要滿(mǎn)足最流行的摘要閱讀器的需要,在生成摘要文件時(shí)要注意以下幾點(diǎn)。
<?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> ... <?xml version="1.0" encoding="utf-8"?> <atom version="1.0"> |
<?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 /?> <updated?>2006-07-06T10:26:30Z</updated?> <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id?> |
在 XML 文件頭中添加編碼信息。
<?xml version="1.0" encoding="utf-8"?> |
當實(shí)現寫(xiě) XML 文件的函數時(shí),使用 OutputStreamWriter 代替 FileWriter 把編碼設置為 utf-8。FileWriter 的默認編碼是 “GBK”。
清單 10. 使用 OutputStreamWriter 把編碼設置為 utf-8 的示例代碼
OutputStreamWriter writer = new OutputStreamWriter(outputstream,"utf-8"); |
![]() ![]() |
![]()
|
本文中,首先回顧了 RSS 和 Atom 摘要的相似點(diǎn)和不同點(diǎn),然后考察了使用兩種摘要類(lèi)型實(shí)現發(fā)布系統的體系結構。這種體系結構包括三個(gè)子系統,彼此相互配合工作。接下來(lái)在逐步演示之后,向您介紹了一些實(shí)現過(guò)程的技巧?,F在您可以享受在新聞?wù)袘眠@些高效方法了。
學(xué)習
Timer 類(lèi)的總結。
獲得產(chǎn)品和技術(shù)
討論
聯(lián)系客服