2009-07-31 4 views
1

Я использую Rome для объединения нескольких каналов в один. В основном это основано на this example на сайте Рима.Установка источника на элемент с использованием Рима

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

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

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

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

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

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

ответ

1

Я нашел обходное решение для этого сейчас.

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

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.

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. Для этого просто введите rrome.properties в корень ваших ресурсов. Не забудьте добавить ядро ​​Dublín своим 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 

И это все.

Смежные вопросы