Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Партнеры
Рекрутерам: Прескрининг кандидатов about
Топ контрибуторов
loading
loading
Знаете ли Вы, что

Вы можете подписаться на RSS ленту новых тестов сервиса Quizful, в том числе и отдельно по каждой категории

Лента обновлений
ссылка 15:38:56
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:11:57
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:03:58
Добавлен вопрос в тест C# - Средний уровень
ссылка 14:51:10
Комментарий от olegchap:
Совершенно правы. Опечатка. Спасибо за сигнал. Исправил...
ссылка 12:12:41
Комментарий от lenarikil:
"Вы как нибудь сами скомпилируйте, а то у меня лапки" ...
Статистика

Тестов: 153, вопросов: 8581. Пройдено: 393520 / 1913905.

Работаем с RSS при помощи Rome

head tail Статья
категория
Java
дата16.07.2010
авторkooper_99
голосов4

Кто работал с RSS просто обязан знать о существовании проекта rome(https://rome.dev.java.net/). Более подробно на счет формата RSS можно почитать здесь http://cyber.law.harvard.edu/rss/rss.html).

На сайте проекта написано следующее:

ROME is a set of Atom/RSS Java utilities that make it easy to work in Java with most syndication formats:

  • RSS 0.90
  • RSS 0.91 Netscape
  • RSS 0.91 Userland
  • RSS 0.92
  • RSS 0.93
  • RSS 0.94
  • RSS 1.0
  • RSS 2.0
  • Atom 0.3
  • Atom 1.0

ROME includes a set of parsers and generators for the various flavors of syndication feeds, as well as converters to convert from one format to another. The parsers can give you back Java objects that are either specific for the format you want to work with, or a generic normalized SyndFeed class that lets you work on with the data without bothering about the incoming or outgoing feed type.

 

Работать с этой библиотекой очено легко и приятно, хорошая документация с примерами. Создать RSSку можно очень быстро используя rome.

Вот как это делается:

1.    Создаем канал

       SyndFeed feed = new SyndFeedImpl();
        feed.setFeedType("rss_2.0");
        feed.setTitle("MyProject Build Results");
        feed.setLink("http://myproject.mycompany.com/project");
        feed.setDescription("Continuous build results for the MyProject project");   

 

2.    Создаем элемент типа айтем и лист для хранения айтэмов

      List entries = new ArrayList();
       SyndEntry entry = new SyndEntryImpl();
        entry.setTitle("BUILD SUCCESSFUL");
        entry.setLink("http://myproject.mycompany.com/continuum/build-results-1");
  entry.setPublishedDate(new Date());
        entries.add(entry);

3.    Добавляем элемент в канал

         feed.setEntries(entries);

4.    Создаем RSS файл

        Writer writer = new FileWriter("stream.xml");
       
SyndFeedOutput output = new SyndFeedOutput();
       
output.output(feed,writer);
     
  writer.close();

Вот так все просто и красиво.

Но это еще далеко не все на может понадобится расширить стандартный набор тэгов RSSа. И это не проблема. Предположим нам надо добавить новый тэг metadata в RSS. Сделать это можно так:

1.    Создаем интерфейс для нужного нам модуля, он будет содержать поля name и value, здесь нам надо наследоваться от Module интерфеса, который содержит объявления  метода getUri() – возвращает URI который идентифицирует модуль. Плюс сам Module интерфейс наследует CopyFrom интерфейс, который содержит  сopyFrom(). Этот метод по сути напоминает реализациям метода clone(). В реализации этого метода должно выполнятся полное копирование дерева объекта. И getInterface() метод который возвращает интерфейс модуля.

public interface MetadataModule extends Module {

    public static final String URI = "http://rome.dev.java.net/module/metadata/1.0";

    String getName();

    void setName(String name);

    String getValue();

    void setValue(String value);

 

}

2.    Имплементируем модуль для нужного нам тэга, здесь мы должны реализовать методы из интерфесов описанных выше.

public class MetadataModuleImpl extends ModuleImpl implements MetadataModule {

String name;

    String value;

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public String getValue() {

        return value;

    }

 

    public void setValue(String value) {

        this.value = value;

    }

 

public Class getInterface() {

        return MetadataModule.class;

    }

 

    public void copyFrom(Object o) {

        MetadataModule sm = (MetadataModule) o;

        setName(sm.getName());

        setValue(sm.getValue());

    } }


3.    Дальше нам надо реализовать генератор RSS, он имплементирует интерфес ModuleGenerator который содержит 2 метода: getNamespaceUri() и generate(Module,Element), ну здесь я думаю объяснения излишни. Метод getNamespaces() используется генератором модулей для объявления пространства имен используемых в этом модуле.

public class MetadaModuleGenerator implements ModuleGenerator {

    private static final Namespace METADATA_NS  =     

    Namespace.getNamespace("metadata ", MetadataModule.URI);

 

        public String getNamespaceUri() {

            return MetadataModule.URI;

        }

 

        private static final Set NAMESPACES;

 

        static {

            Set nss = new HashSet();

            nss.add(METADATA_NS  );

            NAMESPACES = Collections.unmodifiableSet(nss);

        }

 

        public Set getNamespaces() {

            return NAMESPACES;

        }

 

        public void generate(Module module, Element element) {

 

            // this is not necessary, it is done to avoid the namespace definition in every item.

            Element root = element;

            while (root.getParent()!=null && root.getParent() instanceof Element) {

                root = (Element) element.getParent();

            }

            root.addNamespaceDeclaration(METADATA_NS );

 

            MetadataModule fm = (MetadataModule)module;

            if (fm.getName() != null && fm.getValue() != null) {

                element.addContent(generateSimpleElement("metadata", fm.getValue(),  

                                                  "name", fm.getName()));

            }

 

        }

 

        protected Element generateSimpleElement(String elementName, String  

                          elementValue, String attributeName, String attributeValue)  {

            Element element = new Element(elementName, METADATA_NS);

            element.setAttribute(attributeName, attributeValue);

            element.addContent(elementValue);

            return element;

        }

}

4.    Прасерне забываем. Он имплементит ModuleParserинтерфейс, который включает в себя 2 метода: getNamespaceUri() и parse(Element), я думаю предназначение их понятно.

public class MetadataModuleParser implements ModuleParser {

        private static final Namespace METADATA_NS =

        Namespace.getNamespace("metadata", MetadataModule.URI);

 

 

        public String getNamespaceUri() {

            return MetadataModule.URI;

        }

 

        public Module parse(Element dcRoot) {

            boolean foundSomething = false;

            MetadataModule fm = new MetadataModuleImpl();

 

            Element e = dcRoot.getChild("rendition", METADATA_NS);

            if (e != null) {

                foundSomething = true;

                fm.setName(e.getAttributeValue("name"));

                fm.setValue(e.getText());

            }

            return (foundSomething) ? fm : null;

        }

}

5.    Теперь нам осталось создать rome.properties файл и положить его к остальным проперти файлам проекта, romeсам подхватит его.  

# Parsers for RSS 2.0 item modules

#

rss_2.0.item.ModuleParser.classes=com.connecticinc.pengine.plugins.cws.publishing.rss.rome.extentions.xml.MetadataModuleParser

# Generators for RSS_2.0 entry modules

#

rss_2.0.item.ModuleGenerator.classes=com.connecticinc.pengine.plugins.cws.publishing.rss.rome.extentions.xml.MetadataModuleGenerator

Если нужно добавить больше модулей, то они указываются через запятую или пробел в этом же файле.

Все наш новый тэг готов к использованью. Теперь нам остается всего лишь добавить его в айтем. Делаем это следующим образом:

MetadataModule metadataModule = new MetadataModuleImpl();

metadataModule.setName(“some name”);

metadataModule.setValue(“some value”);

entry.getModules().add(metadataModule);

 

 Вот и все в итоге мы получим следующий RSS:

<?xml version="1.0" encoding="UTF-8"?>

<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:metadata="http://rome.dev.java.net/module/metadata/1.0" version="2.0">

  <channel>

    <title>MyProject Build Results</title>

    <link> http://myproject.mycompany.com/project</link>

    <description>build results for the MyProject project</description>

    <item>

      <title>BUILD SUCCESSFUL</title>

      <link>http://myproject.mycompany.com/project/build-results-1</link>

      <pubDate>Wed, 19 May 2010 13:17:27 GMT</pubDate>

      <dc:date>2010-05-19T13:17:27Z</dc:date>

       <metadata:metadata name="some name">some value</metadata:metadata>

    </item>

     </channel>

</rss>

Вот так вот не сильно напрягаясь можно создавать RSS файлы.

 

Ресурсы:

http://wiki.java.net/bin/view/Javawsxml/Rome

http://www.javaworld.com/javaworld/jw-11-2007/jw-11-rome.html?page=1

 

Если Вам понравилась статья, проголосуйте за нее

Голосов: 4  loading...
kooper_99   anton_filin   Silvan   SamTan