Если у вас есть базовые знания синдикации содержимого и спецификации формата RSS 2.0, а также спецификации формата Atom 1.0, значит вы готовы реализовать систему синдикации новостей, используя любую из спецификаций (либо обе), а данная статья предназначена быть для вас практическим справочником.
RSS и Atom аналогичны форматам XML-документов, которые описывают списки родственной информации, известные под названием фиды (feed). Фиды состоят из нескольких элементов, каждый с расширяемым набором присоединенных метаданных; например, каждый элемент имеет заголовок. Основным назначением фидов является синдикация Web-содержимого, например, Web-блогов или заголовков новостей, на Web-сайты и непосредственно в пользовательские агенты.
Два примера 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
<?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-форматами. Их базовые конструкции являются одинаковыми с небольшим отличием в выражениях узлов.
Каждый фид, фактически, представляет канал. Он имеет заголовок канала, ссылку, описание, автора и т.д. Информация о канале предоставляет базовую информацию о фиде. За информацией о канале следует несколько элементов (item). Каждый элемент представляет собой реальный фрагмент новостей или статей, который вы можете прочитать в программе чтения фидов. Обычно элемент содержит заголовок, ссылку, дату обновления и итоговую информацию.
Используя в качестве справочника "RSS 2.0 и Atom 1.0, сравнение", рассмотрим различия между RSS и Atom.
Таблица 1. Сравнение RSS 2.0 и Atom 1.0
| Отличие | RSS 2.0 | Atom 1.0 |
|---|---|---|
| Развертывание | RSS 2.0 широко используется. | Atom 1.0 не распространен. |
| Спецификация | Harvard имеет авторские права и заморозил спецификацию RSS 2.0. | Atompub Working Group (в IETF) согласовала спецификацию Atom 1.0, и она может быть пересмотрена а будущем. |
| Требуемое содержимое | RSS 2.0 требует наличия заголовка уровня фида, ссылку и описание. Наличие в фиде каких-либо индивидуальных полей элементов не требуется. | Atom 1.0 содержит заголовок (который может быть пустым), уникальный идентификатор и временную метку последнего обновления для фидов и записей. |
| Рабочая нагрузка | RSS 2.0 может содержать неформатированный текст или выделенный (escaped) HTML, но вы не можете указать, какой из них двух предоставляется. | Atom 1.0 содержит контейнер рабочей нагрузки. |
| Полное или частичное содержимое | RSS 2.0 имеет элемент <description>, который может содержать полный текст или краткий обзор. Не существует встроенного способа указать, предоставляется ли содержимое полностью. | Atom 1.0 предлагает отдельные элементы <summary> и <content>. Элемент summary используется для удобства, если содержимое представлено в не текстовом формате или не локализовано. |
| Автоматическое обнаружение | Автоматическое обнаружение в 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. Оба класса фидов содержат класс канала (channel) фида и класс элемента (item) фида. Реализации этих классов будут отличаться из-за различий в их конструкциях.
Подсистема функционирования фида
Подсистема функционирования фида обеспечивает функции для работы с этими двумя типами файлов фидов. Например, функции insertItem(), deleteItem(), updateItem(). Диаграмма классов подсистемы функционирования фида выглядит следующим образом:
Рисунок 2. Диаграмма классов подсистемы функционирования фида
Во-первых, вам нужен абстрактный шаблон PublisherFactory для генерирования одного из двух издателей (publisher) фида. Затем издатель извлекает данные из базы данных через класс 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(); //конкретный метод обновления файлов фидов.
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;
}
|
В завершающей процедуре фабрика публикации создает издателя и вставляет связанную информацию о channel и itemlist в определенный фид.
Листинг 5. Пример кода для вставки channel и itemlist
publisher.insertChannel(channel);
publisher.insertItemList(itemlist);
|
Для формирования соответствующих channel и itemlist извлеките данные из базы данных и вставьте их в шаблон фида. Ниже продемонстрировано, как извлечь данные из базы данных и вставить информацию в соответствующий databean.
Листинг 6. Пример кода для фидов
...
NewsBeanManager newsmanager = new NewsBeanManager();
newslist = newsmanager.getAllNews(); //взаимодействие с базой данных
...
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 для наиболее популярных программ чтения фидов
Чтобы удовлетворить требования наиболее популярных программ чтения фидов, обратите внимание на следующие моменты при генерировании файлов фидов.
- Добавьте информацию о версии RSS и Atom к заголовку XML-файла, как показано в листинге 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 информация о ссылке выглядит как узел (node), но в ссылке 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-файлов
Добавьте информацию о кодировке (encoding) в заголовок XML-файла.
Листинг 9. Пример кода для добавления информации о кодировке в заголовок XML-файла
<?xml version="1.0" encoding="utf-8"?>
|
При реализации функции записи XML-файла, используйте OutputStreamWriter вместо FileWriter для установки кодировки в utf-8. Кодировка по умолчанию для FileWriter - "GBK".
Листинг 10. Пример кода для установки кодировки в utf-8 с использованием OutputStreamWriter
OutputStreamWriter writer = new OutputStreamWriter(outputstream,"utf-8");
|
В данной статье вы сначала рассмотрели сходства и отличия фидов RSS и Atom, а затем рассмотрели архитектуру для реализации системы публикации с использованием обоих типов фидов. Эта архитектура состоит их трех подсистем, работающих совместно друг с другом. В результате пошаговой демонстрации вы получили несколько советов по процедуре реализации. Воспользуйтесь этим подходом для создания фидов новостей.
Научиться
- Оригинал статьи "Implement news syndication using RSS and Atom".
-
Что такое Atom?: Быстрый старт в Atom.
-
RSS 2.0 и ATOM 1.0, сравнение: Подробная информация по различиям между RSS 2.0 и Atom 1.0.
-
Спецификация RSS 2.0: Узнайте все, что вам необходимо в спецификации.
-
Фиды RSS и Atom: Создайте ваши собственные фиды RSS и Atom после посещения всеобъемлющего сайта developerWorks.
- "Учебное руководство по RSS": Узнайте, что такое RSS, как он запускается и как это сделать самостоятельно.
-
Workplace RSS-фиды и блоги: Следите за последней информацией на дискуссионных форумах Workplace, на страницах поддержки продукта Workplace, в статьях developerWorks Workplace и в учебных руководствах developerWorks Workplace.
- "Планирование рекуррентных заданий в Java-приложениях" ((Том Вайт (Tom White), developerWorks, ноябрь 2003): Сводная информация по классу
Timerязыка программирования Java. -
Зона Web-разработки на developerWorks: Расширьте ваши знания по разработке сайтов, читая статьи и учебные руководства, посвященные Web-технологиям.
-
Технические события и web-трансляции developerWorks: Следите за техническими сессиями jam-packed, которые сокращают кривую обучения, а также улучшают качество и результаты ваших наиболее сложных проектов.
Получить продукты и технологии
-
Пробное программное обеспечение IBM: Разработайте ваш следующий проект с использованием программного обеспечения, доступного для загрузки непосредственно с developerWorks.
Обсудить
- Примите участие в обсуждении материала на форуме.
-
Блоги developerWorks: Подключайтесь к сообществу developerWorks!
