Установка источника для каждого предмета с использованием Рима - PullRequest
1 голос
/ 31 июля 2009

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Я знаю, что уже немного поздно для ответа, но, возможно, кто-то будет использовать это позже. Я сделал это с Римом 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 в корень ваших ресурсов. Не забудьте добавить дубликат ядра к вашим 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

И это все.

1 голос
/ 03 августа 2009

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

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

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.

...