Установка источника для каждого предмета с использованием Рима
Я использую Рим, чтобы объединить несколько каналов в один. Это в значительной степени основано на этом примере на сайте в Риме.
Я создаю канал RSS 2.0, который я сохраняю как документ (W3C), а затем передаю в таблицу стилей для преобразования в HTML.
Одно из моих требований - отображать источник (ссылку и имя исходного сайта) для каждой записи (поскольку они могут быть получены из различных источников).
В соответствии со спецификацией RSS существует необязательный атрибут источника для каждого элемента. И Рим, кажется, поддерживает это с помощью метода setSource в интерфейсе SyndEntry. Однако установка этого параметра в SyndFeed исходного канала, по-видимому, не устанавливает этот атрибут.
Выводимый мной документ не содержит элемент источника в элементе.
Какие-нибудь подсказки о том, что я могу делать неправильно или предложения об альтернативных методах для того, что я хочу сделать?
Заранее спасибо, Даррен.
2 ответа
Я нашел обходной путь для этого на данный момент.
Поскольку мне действительно нужно дать имя в качестве атрибуции, я переопределяю поле автора следующим образом.
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.
Я знаю, что уже немного поздно для ответа, но, возможно, кто-то будет использовать это позже. Я сделал это с Римом 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
И это все.