Разбор RSS-канала через ROME становится нулевым в качестве источника - PullRequest
2 голосов
/ 16 ноября 2011

Я использую apis com.sun.syndication для анализа RSS-каналов, которые мне нужно в конечном итоге использовать в моем приложении. Проблема, с которой я сталкиваюсь, заключается в том, что для некоторых RSS, например, как

http://rss.news.yahoo.com/rss/mostviewed

Если у нас есть тег с некоторым значением, следующий код возвращает ноль в качестве источника.

URL url  = new URL("http://rss.news.yahoo.com/rss/mostviewed");
    XmlReader reader = null;

    try {
      reader = new XmlReader(url);
      SyndFeed feed = new SyndFeedInput().build(reader);
      System.out.println("Feed Title: "+ feed.getTitle());

      for (Iterator<SyndEntry> i =feed.getEntries().iterator(); i.hasNext();) {
          SyndEntry entry = i.next();
              System.out.println("entry.getSource():"+entry.getSource());
      }

Есть ли у кого-нибудь идеи о том, чего мне здесь не хватает

1 Ответ

1 голос
/ 16 ноября 2011

Это, похоже, не работает "из коробки", потому что конвертер для RSS 2.0 игнорирует (необязательный) элемент источника.

Вы можете написать свой собственный конвертер и установить источник самостоятельно из атрибута источника элемента,Я поместил значение («AP» из вашей ленты) в поле автора здесь:

public class MyConverterForRSS20 extends ConverterForRSS20 {

    public MyConverterForRSS20() {
        this("rss_2.0");
    }

    protected MyConverterForRSS20(String type) {
        super(type);
    }

    @Override
    protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
        SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
        Source source = item.getSource();
        if (source != null) {
            SyndFeed syndFeed = new SyndFeedImpl();
            syndFeed.setLink(source.getUrl());
            syndFeed.setAuthor(source.getValue());
            syndEntry.setSource(syndFeed);
        }
        return syndEntry;
    }
}

К счастью, пользовательский конвертер можно легко подключить к Риму, изменив файл rome.properties и установив MyConverterForRSS20вместо com.sun.syndication.feed.synd.impl.ConverterForRSS20 (последняя строка файла):

# Feed Conversor implementation classes
#
Converter.classes=com.sun.syndication.feed.synd.impl.ConverterForAtom10 \
                  com.sun.syndication.feed.synd.impl.ConverterForAtom03 \
                  com.sun.syndication.feed.synd.impl.ConverterForRSS090 \
                  com.sun.syndication.feed.synd.impl.ConverterForRSS091Netscape \
                  com.sun.syndication.feed.synd.impl.ConverterForRSS091Userland \
                  com.sun.syndication.feed.synd.impl.ConverterForRSS092 \
                  com.sun.syndication.feed.synd.impl.ConverterForRSS093 \
                  com.sun.syndication.feed.synd.impl.ConverterForRSS094 \
                  com.sun.syndication.feed.synd.impl.ConverterForRSS10  \
                  MyConverterForRSS20 
...