如果您對內容發布、RSS 2.0 格式規范以及 Atom 1.0 格式規范有了基本了解,那麼您就可以准備使用其中之一或者使用兩種技術來實現新聞聯合系統,而本文對您來說是一個便利快捷的參考資料。
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 摘要的不同點
表 1. 比較 RSS 2.0 和 Atom 1.0
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 來實現一個重復執行的調度任務。
更一般的是在這個發布系統中組合調度循環任務。
清單 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 摘要
要滿足最流行的摘要閱讀器的需要,在生成摘要文件時要注意以下幾點。
在 XML 文件頭添加 RSS 和 Atom 版本信息,如 清單 7 所示:
清單 7. 添加 RSS 和 Atom 版本信息的示例代碼 <?XML version="1.0" encoding="utf-8"?>
<rss version="2.0">
...
<?XML version="1.0" encoding="utf-8"?>
<atom version="1.0">
為 RSS 和 Atom 通道提供鏈接信息。在 RSS 2.0 中,鏈接信息顯示為節點,但是在 Atom 1.0 中,鏈接信息顯示為屬性。雖然鏈接對於 Atom 來說不是強制項,但是為通道部分提供鏈接信息是一種不錯的做法(參見 清單 8)。
清單 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 摘要的相似點和不同點,然後考察了使用兩種摘要類型實現發布系統的體系結構。這種體系結構包括三個子系統,彼此相互配合工作。接下來在逐步演示之後,向您介紹了一些實現過程的技巧。現在您可以享受在新聞摘要中應用這些高效方法了。