android xml xml-parsing rss

Parse RSS feed para Android



xml xml-parsing (3)

Este es un ejemplo de feed 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)

Quería obtener atributo de comer dentro de.

Actualmente estoy usando

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"; } }

¿Hay alguna forma más simple? Porque ahora mismo es demasiado tedioso. Básicamente quiero decir getElement ("descripción")


Usaría una biblioteca de análisis de RSS de terceros. Cuatro están actualmente en la lista en la categoría de RSS en el Arsenal de Android .

Si no, si el archivo RSS es probable que sea grande, usaría SAX y no me quejaría. Si está seguro de que el archivo RSS será pequeño, el analizador DOM le dará una API que está más en línea con lo que está buscando, pero tiende a ser más lenta y requiere más memoria.


Tal como lo mencionó CommonsWare, probablemente debería utilizar una biblioteca RSS de terceros para esto si desea que sea sencillo. La última biblioteca de RSS en el Arsenal de Android es una que hice: PkRSS https://github.com/Pkmmte/PkRSS

La API es extremadamente simple pero flexible.

// 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);

Por supuesto, hay muchos más detalles si visita la página de GitHub para esta biblioteca.


Descubrí que todo el SAX es difícil de ver. Escribí mi propio analizador para RSS, Atom y RDF.

Pruebe la clase MvNewsFeed en mi biblioteca AndroidWithoutStupid en 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); }

Para abreviar, he usado un método de descarga síncrona. Hay una clase separada para descargas asincrónicas: MvAsyncDownload. Llamar al constructor con los mismos parámetros.