Java – Рим: я пытаюсь проанализировать RSS-канал, но получаю сообщение об ошибке на некоторых каналах

Я пытаюсь работать с RSS и анализировать его. Я нашел Рим и пытаюсь работать с ним по коду:

private SyndFeed parseFeed(String url) throws IllegalArgumentException, FeedException, IOException {
        return new SyndFeedInput().build(new XmlReader(new URL(url)));
    }


    public Boolean processRSSContent(String url) {
        try {
            SyndFeed theFeed = this.parseFeed(url);
            SyndEntry entry = theFeed.getEntries().get(0);
            ZonedDateTime entryUtcDate = ZonedDateTime.ofInstant(entry.getPublishedDate().toInstant(), ZoneOffset.UTC);
            String entryTitle = entry.getTitle();
            String entryText = entry.getDescription().getValue();
        }
        catch (ParsingFeedException e) {
            e.printStackTrace();
            return false;
        }
        catch (FeedException e) {
            e.printStackTrace();
            return false;
        }
        catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

На некоторых каналах, таких как http://feeds.bbci.co.uk/news/world/rss.xml все работает нормально, но на некоторых других каналах типа http://habrahabr.ru/rss/ я получаю сообщение об ошибке:

Invalid XML: Error on line 5: The element type "meta" must be terminated by the matching end-tag "</meta>".
com.rometools.rome.io.ParsingFeedException: Invalid XML: Error on line 5: The element type "meta" must be terminated by the matching end-tag "</meta>". 

Я просмотрел содержимое этой ссылки, и XML действительно странный. Но это популярный сайт, и я получил эту ошибку на некоторых других сайтах, поэтому я не думаю, что проблема в XML. Что я сделал не так? Как читать эти RSS-каналы?


person user3742622    schedule 30.01.2016    source источник


Ответы (1)


Если вы введете адрес http://habrahabr.ru/rss/ в свой браузер, вы заметите, что он перенаправляет на https://habrahabr.ru/rss/interesting. Ваш код не обрабатывает перенаправления.

Я предлагаю вам использовать HttpClientFeedFetcher из модуля rome-fetcher, он обрабатывает перенаправления и имеет другие расширенные функции ( кэширование, условные GET, сжатие):

HttpClientFeedFetcher feedFetcher = new HttpClientFeedFetcher();
try {
    SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://habrahabr.ru/rss/"));
    System.out.println(feed.getLink());
} catch (IllegalArgumentException | IOException | FeedException | FetcherException e) {
    e.printStackTrace();
}

РЕДАКТИРОВАТЬ: Rome-fetcher устарел, но вместо него можно использовать Apache HttpClient, и это более гибкий.

person janih    schedule 31.01.2016