Android: lector de RSS
RSS son las siglas de Really Simple Syndication. RSS es una manera fácil de compartir las actualizaciones y el contenido de su sitio web con sus usuarios para que los usuarios no tengan que visitar su sitio a diario para recibir ningún tipo de actualizaciones.
Ejemplo de RSS
RSS es un documento creado por el sitio web con extensión .xml. Puede analizar fácilmente este documento y mostrárselo al usuario en su aplicación. Un documento RSS se ve así.
<rss version="2.0">
<channel>
<title>Sample RSS</title>
<link>http://www.google.com</link>
<description>World's best search engine</description>
</channel>
</rss>
Elementos RSS
Un documento RSS como el anterior tiene los siguientes elementos.
No Señor | Descripción de Componente |
---|---|
1 |
channel Este elemento se utiliza para describir la fuente RSS. |
2 |
title Define el título del canal |
3 |
link Define el hipervínculo al canal. |
4 |
description Describe el canal |
Analizando RSS
Analizar un documento RSS es más como analizar XML. Ahora veamos cómo analizar un documento XML.
Para esto, crearemos el objeto XMLPullParser, pero para crearlo primero crearemos el objeto XmlPullParserFactory y luego llamaremos a su método newPullParser () para crear XMLPullParser. Su sintaxis se da a continuación:
private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();
El siguiente paso implica especificar el archivo para XmlPullParser que contiene XML. Puede ser un archivo o una secuencia. En nuestro caso es un flujo, su sintaxis se da a continuación:
myparser.setInput(stream, null);
El último paso es analizar el XML. Un archivo XML consta de eventos, nombre, texto, AttributesValue, etc. Por lo tanto, XMLPullParser tiene una función separada para analizar cada componente del archivo XML. Su sintaxis se da a continuación:
int event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
if(name.equals("temperature")){
temperature = myParser.getAttributeValue(null,"value");
}
break;
}
event = myParser.next();
}
El método getEventTypedevuelve el tipo de evento que ocurre. por ejemplo: inicio de documento, inicio de etiqueta, etc. El métodogetName devuelve el nombre de la etiqueta y, dado que solo estamos interesados en la temperatura, simplemente verificamos la declaración condicional de que si obtuvimos una etiqueta de temperatura, llamamos al método getAttributeValue para devolvernos el valor de la etiqueta de temperatura.
Aparte de estos métodos, hay otros métodos proporcionados por esta clase para analizar mejor los archivos XML. Estos métodos se enumeran a continuación:
No Señor | Método y descripción |
---|---|
1 |
getAttributeCount() Este método solo devuelve el número de atributos de la etiqueta de inicio actual. |
2 |
getAttributeName(int index) Este método devuelve el nombre del atributo especificado por el valor del índice. |
3 |
getColumnNumber() Este método devuelve Devuelve el número de columna actual, comenzando desde 0. |
4 |
getDepth() Este método devuelve Devuelve la profundidad actual del elemento. |
5 |
getLineNumber() Devuelve el número de línea actual, comenzando por 1. |
6 |
getNamespace() Este método devuelve el URI del espacio de nombres del elemento actual. |
7 |
getPrefix() Este método devuelve el prefijo del elemento actual. |
8 |
getName() Este método devuelve el nombre de la etiqueta. |
9 |
getText() Este método devuelve el texto de ese elemento en particular. |
10 |
isWhitespace() Este método comprueba si el evento TEXT actual contiene solo caracteres de espacio en blanco. |
Ejemplo
Aquí hay un ejemplo que demuestra el uso de la clase XMLPullParser. Crea una aplicación de análisis básica que le permite analizar un documento RSS presente aquí en /android/sampleXML.xml y luego mostrar el resultado.
Para experimentar con este ejemplo, puede ejecutarlo en un dispositivo real o en un emulador.
Pasos | Descripción |
---|---|
1 | Utilizará Android Studio para crear una aplicación de Android en un paquete com.example.sairamkrishna.myapplication. |
2 | Modifique el archivo src / MainActivity.java para agregar el código necesario. |
3 | Modifique res / layout / activity_main para agregar los componentes XML respectivos. |
4 | Cree un nuevo archivo java en src / HandleXML.java para recuperar y analizar datos XML. |
5 | Cree un nuevo archivo java en src / second.java para mostrar el resultado de XML |
5 | Modifique AndroidManifest.xml para agregar el permiso de Internet necesario. |
6 | Ejecute la aplicación y elija un dispositivo Android en ejecución e instale la aplicación en él y verifique los resultados. |
A continuación se muestra el contenido del archivo de actividad principal modificado src/MainActivity.java.
package com.example.sairamkrishna.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
EditText title,link,description;
Button b1,b2;
private String finalUrl="http://tutorialspoint.com/android/sampleXML.xml";
private HandleXML obj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
title = (EditText) findViewById(R.id.editText);
link = (EditText) findViewById(R.id.editText2);
description = (EditText) findViewById(R.id.editText3);
b1=(Button)findViewById(R.id.button);
b2=(Button)findViewById(R.id.button2);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
obj = new HandleXML(finalUrl);
obj.fetchXML();
while(obj.parsingComplete);
title.setText(obj.getTitle());
link.setText(obj.getLink());
description.setText(obj.getDescription());
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent in=new Intent(MainActivity.this,second.class);
startActivity(in);
}
});
}
}
A continuación se muestra el contenido del archivo java src/HandleXML.java.
package com.example.rssreader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.util.Log;
public class HandleXML {
private String title = "title";
private String link = "link";
private String description = "description";
private String urlString = null;
private XmlPullParserFactory xmlFactoryObject;
public volatile boolean parsingComplete = true;
public HandleXML(String url){
this.urlString = url;
}
public String getTitle(){
return title;
}
public String getLink(){
return link;
}
public String getDescription(){
return description;
}
public void parseXMLAndStoreIt(XmlPullParser myParser) {
int event;
String text=null;
try {
event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.TEXT:
text = myParser.getText();
break;
case XmlPullParser.END_TAG:
if(name.equals("title")){
title = text;
}
else if(name.equals("link")){
link = text;
}
else if(name.equals("description")){
description = text;
}
else{
}
break;
}
event = myParser.next();
}
parsingComplete = false;
}
catch (Exception e) {
e.printStackTrace();
}
}
public void fetchXML(){
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
InputStream stream = conn.getInputStream();
xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myparser = xmlFactoryObject.newPullParser();
myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
myparser.setInput(stream, null);
parseXMLAndStoreIt(myparser);
stream.close();
}
catch (Exception e) {
}
}
});
thread.start();
}
}
Crear un archivo y nombrarlo como segundo archivo.java en el directorio java/second.java
package com.example.sairamkrishna.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
public class second extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
WebView w1=(WebView)findViewById(R.id.webView);
w1.loadUrl("http://tutorialspoint.com/android/sampleXML.xml");
}
}
Cree un archivo xml en res/layout/second_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView"
android:layout_gravity="center_horizontal" />
</LinearLayout>
Modificar el contenido de res/layout/activity_main.xml a lo siguiente -
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:transitionGroup="true">
<TextView android:text="RSS example" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textview"
android:textSize="35dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:id="@+id/textView"
android:layout_below="@+id/textview"
android:layout_centerHorizontal="true"
android:textColor="#ff7aff24"
android:textSize="35dp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:theme="@style/Base.TextAppearance.AppCompat" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageView"
android:hint="Tittle"
android:textColorHint="#ff69ff0e"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_below="@+id/editText"
android:layout_alignLeft="@+id/editText"
android:layout_alignStart="@+id/editText"
android:textColorHint="#ff21ff11"
android:hint="Link"
android:layout_alignRight="@+id/editText"
android:layout_alignEnd="@+id/editText" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText3"
android:layout_below="@+id/editText2"
android:layout_alignLeft="@+id/editText2"
android:layout_alignStart="@+id/editText2"
android:hint="Description"
android:textColorHint="#ff33ff20"
android:layout_alignRight="@+id/editText2"
android:layout_alignEnd="@+id/editText2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fetch"
android:id="@+id/button"
android:layout_below="@+id/editText3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/imageView"
android:layout_toStartOf="@+id/imageView" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Result"
android:id="@+id/button2"
android:layout_alignTop="@+id/button"
android:layout_alignRight="@+id/editText3"
android:layout_alignEnd="@+id/editText3" />
</RelativeLayout>
Modificar el res/values/string.xml a lo siguiente
<resources>
<string name="app_name">My Application</string>
</resources>
Este es el predeterminado AndroidManifest.xml.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".second"></activity>
</application>
</manifest>
Intentemos ejecutar su aplicación. Supongo que habías creado tuAVDmientras realiza la configuración del entorno. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar de la barra de herramientas. Android Studio instala la aplicación en su AVD y la inicia y, si todo está bien con su configuración y aplicación, se mostrará la siguiente ventana del emulador:
Simplemente presione el botón Obtener fuente para obtener una fuente RSS. Después de presionar, aparecería la siguiente pantalla que mostraría los datos RSS.
Simplemente presione el botón de resultado para ver XML, que se coloca en http://tutorialspoint.com/android/sampleXML.xml