Установка источника для каждого элемента с помощью Rome

Я использую Rome, чтобы объединить несколько фидов в один. Он во многом основан на этом примере на сайте Рима.

Я создаю канал RSS 2.0, который сохраняю как документ (W3C), а затем передаю в таблицу стилей для преобразования в HTML.

Одно из моих требований — отображать источник (ссылку и название исходного сайта) для каждой записи (поскольку они могут поступать из разных источников).

Согласно спецификации RSS, для каждого элемента существует необязательный атрибут источника. И Rome, похоже, поддерживает это с помощью метода setSource в интерфейсе SyndEntry. Однако установка этого параметра на SyndFeed исходного канала не приводит к установке этого атрибута.

Документ, который я вывожу, не содержит исходного элемента в элементе.

Любые подсказки о том, что я могу делать неправильно, или предложения по альтернативным методам выполнения того, что я хочу сделать?

Заранее спасибо, Даррен.


person Darren Greaves    schedule 31.07.2009    source источник


Ответы (2)


Я знаю, что немного поздно для ответа, но, возможно, кто-то воспользуется этим позже. Я сделал это с rome 1.0.

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

Мне нужен был канал RSS 2.0 с исходным полем в элементах. Так что и для конвертера, и для генератора я расширяю реализацию RSS 2.0 от ROME.

Сначала нам нужен преобразователь. Это тот, кто наполнит источник

/**
 * This is a convertor for RSS 2.0 setting source on output items
 */
public class ConverterForRSS20WithSource extends ConverterForRSS20 {

    /**
     * Default Constructor
     */
    public ConverterForRSS20WithSource() {
        this("rss_2.0_withSource");
    }

    /**
     * Constructor with type
     * @param type
     */
    protected ConverterForRSS20WithSource(String type) {
        super(type);
    }

    /** 
     * @see com.sun.syndication.feed.synd.impl.ConverterForRSS094#createRSSItem(com.sun.syndication.feed.synd.SyndEntry)
     */
    @Override
    protected Item createRSSItem(SyndEntry sEntry) {
        Item item = super.createRSSItem(sEntry);
        if(sEntry.getSource() != null 
                && StringUtils.isNotBlank(sEntry.getSource().getUri())) {
            Source s = new Source();
            s.setUrl(sEntry.getSource().getUri());
            s.setValue(sEntry.getSource().getTitle());
            item.setSource(s);
        }

        return item;
    }
}

Тогда нам нужен Генератор. Это не имеет ничего особенного. Это просто должно было быть

/**
 *  Rss 2.0 Generator with source field
 */
public class RSS020GeneratorWithSource extends RSS20Generator {

    /**
     * 
     */
    public RSS020GeneratorWithSource() {
        super("rss_2.0_withSource","2.0");
    }

}

Нам нужно сделать одну последнюю вещь, объявить наши классы в Риме. Для этого просто поместите rome.properties в корень ваших ресурсов. Не забудьте добавить ядро ​​dublin в ваш rss.items... В этом файле просто поместите

Converter.classes=my.package.ConverterForRSS20WithSource

WireFeedGenerator.classes=my.package.RSS020GeneratorWithSource

# Parsers for RSS 2.0 with source item modules
#
rss_2.0_withSource.item.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser

# Generators for RSS_2.0 entry modules
#
rss_2.0_withSource.item.ModuleGenerator.classes=com.sun.syndication.io.impl.DCModuleGenerator

И это все.

person Samuel    schedule 14.12.2011

Я нашел обходной путь для этого на данный момент.

Поскольку мне действительно нужно указать только имя в качестве атрибуции, я переопределяю поле автора следующим образом.

SyndEntry entry = // fetched from SyndFeed
Module dcModule = entry.getModule(DCModule.URI);
String title = // My overridden title
if (dcModule != null && title != null) {
    ((DCModule)dcModule).setCreator(title);
}

Причина, по которой я использую этот код вместо SyndEntry.setAuthor, заключается в том, что вызов, который устанавливает автора только в том случае, если он равен нулю, нам всегда нужно устанавливать его в наше значение.

Затем я ссылаюсь на это как на dc:creator в своей таблице стилей XSL.

person Darren Greaves    schedule 03.08.2009