¿Analizar una fuente RSS para la aplicación de Android? ¿Es jsoup la respuesta?

Estoy leyendo el libro de desarrollo de Head First Android. En el tercer capítulo, donde intentan hacer una aplicación de la fuente RSS de la NASA desde aquí .
En el libro, el autor utiliza SAX parser para Java. Busqué en línea y algunas de las respuestas aquí en SO sugieren que SAX está desactualizado y que hay soluciones más nuevas.

Sin embargo, no estoy seguro de cuáles son los más fáciles de usar para Java. He usado Nokogiri para ruby y algo similar sería increíble. Miré jsoup y parecía estar bien, pero me pregunto qué sugerencias podrían tener ustedes.

0
agregado el autor Aamirkhan, fuente
ver este enlace androidhive.info tal vez sea útil para usted.
agregado el autor Vivek Kumar Srivastava, fuente

5 Respuestas

Soy el autor de Head First Android Development, así que solo quería compartir algunas ideas. SAX es definitivamente un poco engorroso, pero directo y fue incorporado en Android por un tiempo (de ahí la decisión de usar eso en el libro). También soy desarrollador de rails y soy un gran fanático de nokogiri y lo uso a menudo. En cuanto a jsoup, definitivamente podría ver que es útil. Dicho esto, no lo he probado, así que no puedo dar ninguna experiencia de primera mano con él.

Otra opción para mirar es el xml PullParser integrado en Android. Todavía es bastante similar a SAX, pero un poco más completo.

Espero que esto ayude.

1
agregado
Johathan, me encanta tu libro, pero también estoy luchando con el analizador xml. El código en github para el capítulo 3 no funciona actualmente y me preguntaba si se solucionarán pronto. Estoy pensando en tratar de hacer mi propio analizador después de no poder tratar de modificar tu analizador (lo tengo que compilar pero la fuerza de la aplicación se cierra = /). ¡Gracias!
agregado el autor Tyler Pfaff, fuente

El código en el capítulo 3 se detiene porque Android no admite redes en su hilo principal.

Así que puedes usar cualquier analizador como XmlPullParser, pero asegúrate de desconectar la red (descargar el feed, etc.) de su hilo principal. Puede usar AsyncTask para sacar la red fuera del hilo principal ... o crear un nuevo hilo() y hacer la red en ese hilo (recomendado)

De hecho, en el capítulo 4, en realidad HIZO crear un nuevo hilo para hacer la red. Entonces, si usas el código del capítulo4, entonces funcionará.

Otro problema que puede enfrentar es OutOfMemoryError porque las imágenes diarias de la NASA son realmente grandes en estos días. Por lo tanto, deberá decodificar la imagen con inSampleSize. Puede verificar otras preguntas sobre la decodificación de una imagen para obtener lo que desea. Buena suerte. )

1
agregado

Creo que SAX es una forma predeterminada de lograrlo, no hay fundamentos para intentar algo nuevo :)

0
agregado

Desde versión 1.6.2 , Jsoup también admite oficialmente el análisis de XML. Esto le permite analizar xml y seleccionar elementos usando selectores de CSS similares a jQuery. Para crear un documento xml con Jsoup, necesita el siguiente en lugar del método Jsoup # parse() :

Document document = Parser.xmlParser().parseInput(xmlString, "");
// ...

This way the input won't implicitly be treated as HTML5 (so, no auto-included <html><head> tags and so on).

0
agregado

Soy un gran fan de Jsoup. Recientemente comencé a usarlo y es increíble. Solía ​​escribir algunos patrones regex súper velludos para hacer patrones coincidentes porque quería evitar SAX como la peste ... y eso fue bastante tedioso como te puedes imaginar. Jsoup me dejó analizar elementos específicos de un<table> in just a few lines of code.

Let's say I want to take the first 7 rows of a table where the <tr class=...> is GridItem or GridAltItem. Then, lets say we want to print the 1st, 2nd, and 3rd columns as text and then the first link that appears in the row. Sounds goofy, but I had to do this and I can do this easily:

String page = "... some html markup fetched from somewhere ...";
Document doc = Jsoup.parse(page);
for(int x=0; x< 7; x++) {
  Element gridItem = doc.select("tr[class$=Item]").select("tr").get(x);
  System.out.println("row: " + gridItem.select("td").get(0).text() + " " + gridItem.select("td").get(1).text() + " " + gridItem.select("td").get(4).text() + " " + gridItem.select("a").get(0).attr("href"));
}

Its that simple with Jsoup. Make sure you add the Jsoup jar file to your project as a library and import those classes which you need: you don't want to import the wrong Document or Element class...

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

Enjoy!

0
agregado