Android - czytnik RSS

RSS to skrót od Really Simple Syndication. RSS to łatwy sposób na udostępnianie użytkownikom aktualizacji i treści witryny internetowej, dzięki czemu użytkownicy nie muszą codziennie odwiedzać witryny w celu uzyskania jakichkolwiek aktualizacji.

Przykład RSS

RSS to dokument tworzony przez serwis WWW z rozszerzeniem .xml. Możesz łatwo przeanalizować ten dokument i pokazać go użytkownikowi w swojej aplikacji. Dokument RSS wygląda następująco.

<rss version="2.0">
   <channel>
      <title>Sample RSS</title>
      <link>http://www.google.com</link>
      <description>World's best search engine</description>
   </channel>
</rss>

Elementy RSS

Dokument RSS, taki jak powyżej, zawiera następujące elementy.

Sr.No Opis podzespołu
1

channel

Ten element służy do opisu źródła RSS

2

title

Określa tytuł kanału

3

link

Definiuje hiperłącze do kanału

4

description

Opisuje kanał

Przetwarzanie RSS

Przetwarzanie dokumentu RSS jest bardziej podobne do analizowania XML. Zobaczmy teraz, jak przeanalizować dokument XML.

W tym celu stworzymy obiekt XMLPullParser, ale aby go stworzyć, najpierw utworzymy obiekt XmlPullParserFactory, a następnie wywołamy jego metodę newPullParser (), aby utworzyć XMLPullParser. Jego składnia jest podana poniżej -

private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();

Następny krok obejmuje określenie pliku dla XmlPullParser, który zawiera XML. Może to być plik lub strumień. W naszym przypadku jest to strumień, którego składnię podano poniżej -

myparser.setInput(stream, null);

Ostatnim krokiem jest przeanalizowanie XML. Plik XML składa się ze zdarzeń, nazwy, tekstu, wartości atrybutów itp. Dlatego XMLPullParser ma oddzielną funkcję do analizowania każdego składnika pliku XML. Jego składnia jest podana poniżej -

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

Metoda getEventTypezwraca typ zdarzenia, które ma miejsce. np .: Początek dokumentu, początek tagu itp. MetodagetName zwraca nazwę tagu, a ponieważ interesuje nas tylko temperatura, więc sprawdzamy w instrukcji warunkowej, że jeśli mamy tag temperatury, wywołujemy metodę getAttributeValue aby zwrócić nam wartość tagu temperatury.

Oprócz tych metod istnieją inne metody zapewniane przez tę klasę w celu lepszego analizowania plików XML. Te metody są wymienione poniżej -

Sr.No Metoda i opis
1

getAttributeCount()

Ta metoda po prostu Zwraca liczbę atrybutów bieżącego tagu początkowego.

2

getAttributeName(int index)

Ta metoda zwraca nazwę atrybutu określonego przez wartość indeksu.

3

getColumnNumber()

Ta metoda zwraca Zwraca numer bieżącej kolumny, zaczynając od 0.

4

getDepth()

Ta metoda zwraca Zwraca bieżącą głębokość elementu.

5

getLineNumber()

Zwraca numer bieżącego wiersza, zaczynając od 1.

6

getNamespace()

Ta metoda zwraca identyfikator URI przestrzeni nazw bieżącego elementu.

7

getPrefix()

Ta metoda zwraca prefiks bieżącego elementu.

8

getName()

Ta metoda zwraca nazwę tagu.

9

getText()

Ta metoda zwraca tekst dla tego konkretnego elementu.

10

isWhitespace()

Ta metoda sprawdza, czy bieżące zdarzenie TEXT zawiera tylko białe znaki.

Przykład

Oto przykład demonstrujący użycie klasy XMLPullParser. Tworzy podstawową aplikację analizującą, która umożliwia przeanalizowanie dokumentu RSS znajdującego się tutaj w /android/sampleXML.xml, a następnie wyświetlenie wyniku.

Aby poeksperymentować z tym przykładem, możesz uruchomić to na rzeczywistym urządzeniu lub w emulatorze.

Kroki Opis
1 Użyjesz Android Studio do stworzenia aplikacji na Androida w pakiecie com.example.sairamkrishna.myapplication.
2 Zmodyfikuj plik src / MainActivity.java, aby dodać niezbędny kod.
3 Zmodyfikuj res / layout / activity_main, aby dodać odpowiednie komponenty XML.
4 Utwórz nowy plik java w src / HandleXML.java, aby pobrać i przeanalizować dane XML.
5 Utwórz nowy plik java w lokalizacji src / second.java, aby wyświetlić wynik XML
5 Zmodyfikuj plik AndroidManifest.xml, aby dodać niezbędne uprawnienia internetowe.
6 Uruchom aplikację i wybierz działające urządzenie z systemem Android, zainstaluj na nim aplikację i sprawdź wyniki.

Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania 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);
         }
      });
   }

}

Poniżej znajduje się zawartość pliku 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(); 
   }
}

Utwórz plik i nazwij go jako plik second.java w katalogu 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");
   }
}

Utwórz plik xml pod adresem 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>

Zmodyfikuj zawartość res/layout/activity_main.xml do następujących -

<?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>

Zmodyfikuj res/values/string.xml do następujących

<resources>
   <string name="app_name">My Application</string>
</resources>

To jest ustawienie domyślne 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>

Spróbujmy uruchomić Twoją aplikację. Zakładam, że stworzyłeś swójAVDpodczas konfigurowania środowiska. Aby uruchomić aplikację ze studia Android, otwórz jeden z plików aktywności projektu i kliknij

ikonę Uruchom na pasku narzędzi. Studio Android instaluje aplikację na AVD i uruchamia ją, a jeśli wszystko jest w porządku z konfiguracją i aplikacją, wyświetli się następujące okno emulatora -

Wystarczy nacisnąć przycisk Fetch Feed, aby pobrać kanał RSS. Po naciśnięciu pojawi się następujący ekran pokazujący dane RSS.

Wystarczy nacisnąć przycisk wyniku, aby zobaczyć XML, który jest umieszczony w http://tutorialspoint.com/android/sampleXML.xml