Android-RSS 리더

RSS는 Really Simple Syndication을 의미합니다. RSS는 웹 사이트 업데이트 및 콘텐츠를 사용자와 공유하는 쉬운 방법이므로 사용자가 어떤 종류의 업데이트를 위해 매일 사이트를 방문하지 않아도됩니다.

RSS 예

RSS는 웹 사이트에서 .xml 확장자를 사용하여 만든 문서입니다. 이 문서를 쉽게 구문 분석하여 애플리케이션에서 사용자에게 표시 할 수 있습니다. RSS 문서는 다음과 같습니다.

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

RSS 요소

위와 같은 RSS 문서에는 다음과 같은 요소가 있습니다.

Sr. 아니요 구성 요소 및 설명
1

channel

이 요소는 RSS 피드를 설명하는 데 사용됩니다.

2

title

채널의 제목을 정의

link

채널에 대한 하이퍼 링크를 정의합니다.

4

description

채널을 설명합니다.

RSS 구문 분석

RSS 문서를 구문 분석하는 것은 XML 구문 분석과 비슷합니다. 이제 XML 문서를 구문 분석하는 방법을 살펴 보겠습니다.

이를 위해 XMLPullParser 객체를 생성하지만이를 생성하기 위해서는 먼저 XmlPullParserFactory 객체를 생성 한 다음 newPullParser () 메서드를 호출하여 XMLPullParser를 생성합니다. 구문은 다음과 같습니다.

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

다음 단계에서는 XML이 포함 된 XmlPullParser에 대한 파일을 지정합니다. 파일 일 수도 있고 스트림 일 수도 있습니다. 우리의 경우에는 스트림이며 구문은 다음과 같습니다.

myparser.setInput(stream, null);

마지막 단계는 XML을 구문 분석하는 것입니다. XML 파일은 events, Name, Text, AttributesValue 등으로 구성되어 있으므로 XMLPullParser에는 XML 파일의 각 구성 요소를 구문 분석하는 별도의 기능이 있습니다. 구문은 다음과 같습니다.

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

방법 getEventType발생하는 이벤트 유형을 반환합니다. 예 : 문서 시작, 태그 시작 등 방법getName 태그의 이름을 반환하고 온도에만 관심이 있으므로 온도 태그가 있으면 메서드를 호출하는 조건문을 확인합니다. getAttributeValue 온도 태그의 값을 반환합니다.

이러한 메서드 외에도 XML 파일을 더 잘 구문 분석하기 위해이 클래스에서 제공하는 다른 메서드가 있습니다. 이러한 방법은 다음과 같습니다.

Sr. 아니요 방법 및 설명
1

getAttributeCount()

이 메서드는 현재 시작 태그의 속성 수를 반환합니다.

2

getAttributeName(int index)

이 메서드는 인덱스 값으로 지정된 속성의 이름을 반환합니다.

getColumnNumber()

이 메서드는 0부터 시작하여 현재 열 번호를 반환합니다.

4

getDepth()

이 메서드는 요소의 현재 깊이를 반환합니다.

5

getLineNumber()

1부터 시작하여 현재 줄 번호를 반환합니다.

6

getNamespace()

이 메서드는 현재 요소의 네임 스페이스 URI를 반환합니다.

7

getPrefix()

이 메서드는 현재 요소의 접두사를 반환합니다.

8

getName()

이 메서드는 태그의 이름을 반환합니다.

9

getText()

이 메서드는 특정 요소에 대한 텍스트를 반환합니다.

10

isWhitespace()

이 메서드는 현재 TEXT 이벤트에 공백 문자 만 포함되어 있는지 확인합니다.

다음은 XMLPullParser 클래스의 사용을 보여주는 예제입니다. 여기에있는 RSS 문서를 /android/sampleXML.xml 에 구문 분석 한 다음 결과를 표시 할 수있는 기본 구문 분석 애플리케이션을 만듭니다 .

이 예제를 실험하기 위해 실제 장치 또는 에뮬레이터에서 실행할 수 있습니다.

단계 기술
1 Android 스튜디오를 사용하여 com.example.sairamkrishna.myapplication 패키지 아래에 Android 애플리케이션을 만듭니다.
2 src / MainActivity.java 파일을 수정하여 필요한 코드를 추가합니다.
res / layout / activity_main을 수정하여 각 XML 구성 요소를 추가하십시오.
4 src / HandleXML.java 아래에 새 Java 파일을 만들어 XML 데이터를 가져오고 구문 분석합니다.
5 XML 결과를 표시하기 위해 src / second.java 아래에 새 Java 파일을 생성합니다.
5 필요한 인터넷 권한을 추가하려면 AndroidManifest.xml을 수정하십시오.
6 애플리케이션을 실행하고 실행중인 Android 기기를 선택하고 여기에 애플리케이션을 설치하고 결과를 확인합니다.

다음은 수정 된 주요 활동 파일의 내용입니다. 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);
         }
      });
   }

}

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

파일을 만들고 디렉토리 아래에 second.java 파일로 이름 지정 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");
   }
}

에서 xml 파일 만들기 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>

내용 수정 res/layout/activity_main.xml 다음에-

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

수정 res/values/string.xml 다음에

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

이것이 기본값입니다. 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>

애플리케이션을 실행 해 보겠습니다. 나는 당신이 당신의AVD환경 설정을하는 동안. Android 스튜디오에서 앱을 실행하려면 프로젝트의 활동 파일 중 하나를 열고

도구 모음에서 실행 아이콘을 클릭하십시오 . Android 스튜디오는 AVD에 앱을 설치하고 시작하고 설정 및 애플리케이션에 문제가 없으면 다음 에뮬레이터 창에 표시됩니다.

RSS 피드를 가져 오려면 피드 가져 오기 버튼을 누르기 만하면됩니다. 를 누르면 RSS 데이터를 보여주는 다음 화면이 나타납니다.

결과 버튼을 누르면 XML이 표시됩니다. http://tutorialspoint.com/android/sampleXML.xml