Parse RSS-канал для Android

Это пример RSS-канала.

http://na.leagueoflegends.com/en/rss.xml

<channel> <title>Most Recent News</title> <link>http://na.leagueoflegends.com/en/rss.xml</link> <description/> <language>en-US</language> <item> <title>Community-recommended bundles available now </title> <link>http://na.leagueoflegends.com/en/news/store/sales/community-recommended-bundles-available-now?ref=rss</link> <description>&lt;div class="field field-name-field-body-small field-type-text-long field-label-hidden">Craving something new at champ select? Get fed on these limited-time bundles based on players' suggestions!&lt;/div>&lt;div class="field field-name-field-article-media field-type-file field-label-hidden">&lt;div id="file-11675" class="file file-image file-image-jpeg"> &lt;img typeof="foaf:Image" src="/sites/default/files/styles/large/public/upload/bundle-banner_1.jpg?itok=4MD_leb5" width="480" height="270" alt="" title="" />&lt;/div>&lt;/div>&lt;div class="field field-name-custom-author field-type-entityreference field-label-hidden">&lt;span class="article_detail">&lt;span class="posted_by">By WizardCrab&lt;/span>&lt;/span>&lt;/div></description> <pubDate>Mon, 30 Jun 2014 19:35:11 +0000</pubDate> <dc:creator>sbroome</dc:creator> <guid isPermaLink="false">18268 at http://na.leagueoflegends.com</guid> </item> <item> <title>Champion and skin sale: 07.04 - 07.07</title> <link>http://na.leagueoflegends.com/en/news/store/sales/champion-and-skin-sale-0704-0707?ref=rss</link> <description>&lt;div class="field field-name-field-body-small field-type-text-long field-label-hidden">Grab these champions and skins on sale for 50% off for a limited time:&lt;/div>&lt;div class="field field-name-field-article-media field-type-file field-label-hidden">&lt;div id="file-13873" class="file file-image file-image-jpeg"> &lt;img typeof="foaf:Image" src="/sites/default/files/styles/large/public/upload/mu842qnf.jpg?itok=OktrEQdQ" width="480" height="270" alt="" title="" />&lt;/div>&lt;/div>&lt;div class="field field-name-custom-author field-type-entityreference field-label-hidden">&lt;span class="article_detail">&lt;span class="posted_by">By WizardCrab&lt;/span>&lt;/span>&lt;/div></description> <pubDate>Tue, 24 Jun 2014 21:24:10 +0000</pubDate> <dc:creator>sbroome</dc:creator> <guid isPermaLink="false">18060 at http://na.leagueoflegends.com</guid> </item> <item> .... .... .... (and goes on for a while) 

Я хотел получить атрибут еды внутри.

В настоящее время я использую

  URL rssFeedUrl = new URL(rssUrl); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); RSSHandler rssHandler = new RSSHandler(); xmlReader.setContentHandler(rssHandler); InputSource inputSource = new InputSource(rssFeedUrl.openStream()); xmlReader.parse(inputSource); private class RSSHandler extends DefaultHandler { public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { if (localName.equals("item")) { item = true; } if(item) { if(localName.equals(RSS_TITLE)) { } else if(localName.equals(RSS_LINK)) { } else if(localName.equals(RSS_DESCRIPTION)) { } else if(localName.equals(RSS_PUB_DATE)) { } else if(localName.equals(RSS_CREATOR)) { } else if(localName.equals(RSS_GUID)) { } } if (!localName.equals("item") && item == true) { rssResult = rssResult + "\n\n" + localName + ": "; } } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { } public void characters(char[] ch, int start, int length) throws SAXException { String cdata = new String(ch, start, length); if (item == true) { String x = (cdata.trim()).replaceAll("\\s+", " "); rssResult = rssResult + x + "\t"; } } 

Есть ли более простой способ? Потому что сейчас это слишком утомительно. Я в основном хочу сказать getElement («описание»)

Как упоминалось в CommonsWare, для этого вам, вероятно, следует использовать стороннюю RSS-библиотеку, если вы хотите сохранить ее простой. Самая новая библиотека RSS в Android Arsenal – это то, что я сделал: PkRSS https://github.com/Pkmmte/PkRSS

API чрезвычайно прост, но гибкий.

 // Loads your RSS feed in a background thread PkRSS.with(this).load(url).async(); // After it has finished loading, use this to get the result List<Article> articleList = PkRSS.with(this).get(url); 

Конечно, есть намного больше деталей, если вы посетите страницу GitHub для этой библиотеки.

Я бы использовал стороннюю библиотеку RSS-синтаксического анализа. Четыре из них в настоящее время перечислены в категории RSS в Android Arsenal .

Если нет, если файл RSS, вероятно, будет большим, я бы использовал SAX и не жаловался. Если вы уверены, что файл RSS будет небольшим, парсер DOM предоставит вам API, который будет соответствовать тому, что вы ищете, но он имеет тенденцию быть медленнее и интенсивнее.

Я нашел всю вещь SAX, на которую трудно было смотреть. Я написал собственный парсер для RSS, Atom & RDF.

Попробуйте класс MvNewsFeed в моей библиотеке AndroidWithoutStupid на GitHub. https://github.com/vsubhash/AndroidWithoutStupid

 MvGeneral.startSyncDownload("http://www.example.com/rss.xml", "/mnt/sdcard/rss.xml"); MvNewsFeed oFeed = new MvNewsFeed("/mnt/sdcard/rss.xml"); for (int i = 0; i < oFeed.moMessages.size(); i++) { Log.d("YOUR_TAG", oFeed.moMessages.get(i).msMessageTitle); Log.d("YOUR_TAG", oFeed.moMessages.get(i).msMessageContent); Log.d("YOUR_TAG", oFeed.moMessages.get(i).msMessageLink); } 

Для краткости я использовал синхронный метод загрузки. Существует отдельный класс для асинхронных загрузок – MvAsyncDownload. Вызовите конструктор с теми же параметрами.

Intereting Posts
Android Studio – перенос проектов из eclipse Android textColor селектор Отклонить запрос на запрос о разрешении на Зефир с помощью кнопки «Назад» Скорость запуска при запуске Зачем использовать аргумент, когда вы можете выполнять одну и ту же задачу с помощью статических переменных? Написание тестов для приложений Flow и Mortar Обработка кадров камеры Android в режиме реального времени Вопрос активности (начинающий) Хотите реализовать notifyDataSetChanged или autorefresh для моего RecyclerView, но его не работает Для вызова требуется разрешение, которое может быть отклонено пользователем Активность, AppCompatActivity, FragmentActivity и ActionBarActivity: когда использовать что? Как добавить текст в значки в ActionBar? Какова структура / шаблон для android / java для организации HTTP-вызовов веб-службы в проекте? Студия Android – добавьте библиотеку из github Приложение Android new Photos падает при попытке отредактировать изображение после использования камеры