2016-01-30 3 views
1

Я пытаюсь работать с rss и анализировать его. Я нашел в Риме, и я пытаюсь работать с этим кодом:Java - Rome: Я пытаюсь разобрать 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-каналы? Может, кто-нибудь протянет мне руку помощи, пожалуйста?

ответ

2

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

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

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(); 
} 

EDIT: Rome-fetcher is being deprecated, но Apache HttpClient можно использовать вместо и его является более гибким.

+0

Спасибо человеку! Помогает. – user3742622