RSSリーダーを作成する。xmlとかをパースする。

前回のよりItproさんの方のrssリーダーの記事でrssリーダーを作成しているのですが、

記事が古いのか、初心者用ではないのか。。若干きつくなって逃げ出したいのですが、

rssリーダーを作成してみたいと思います。

今回はパース機能を知るです。

RSSを読み込む時には

DOM,SAX,StAXの3種類がある。通常htmlはDOMとかでjavascriptを使用するのですが、パフォーマンスを考えると、DOMは使わない方がよいらしい。

また、こういった読み込みを行う際には、AsyncTaskを用いて、非同期で処理を行う事で、ユーザーの操作を損なう事なく、さまざまな機能を追加する事ができる。

XmlPullParserを利用すると、簡単にxmlの解析ができるようです。

adakodaさんのサイトで、分かりやすく紹介がされています。

とくりには、全ての要素をタグやtxtごとに一行一行とみなして、上から順番に検索をして言ってくれるようです。

depth=0, eventType=START_DOCUMENT,  name=null   //
depth=1, eventType=  START_TAG,     name=lv1    // <lv1>
depth=1, eventType=    TEXT,        name=null   //   a
depth=2, eventType=      START_TAG, name=lv2    //     <lv2>
depth=2, eventType=        TEXT,    name=null   //       b
depth=2, eventType=      END_TAG,   name=lv2    //     </lv2>
depth=1, eventType=    TEXT,        name=null   //   c
depth=1, eventType=  END_TAG,       name=lv1    // </lv1>
depth=0, eventType=END_DOCUMENT,    name=null   //

lv1にはテキストが入っていない場合もあると思うけど、それが、タグか、テキストかって事にしか焦点はないようなので、

簡単にできそうです。

パースのクラスにも少し修正を加えて、下記のようになりました。

package in.andante.rssReads;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Xml;
import android.widget.ListView;

//RssParserTask.java
public class RssParserTask extends AsyncTask<String, Integer, RssListAdapter> {

 private rssReads mActivity;
 private RssListAdapter mAdapter;
 private ProgressDialog mProgressDialog;
 private ListView mListView;

 // コンストラクタ
 public RssParserTask(rssReads activity, RssListAdapter adapter,ListView _listView) {
 mActivity = activity;
 mListView = _listView;
 mAdapter = adapter;
 }

 // タスクを実行した直後にコールされる
 @Override
 protected void onPreExecute() {
 // プログレスバーを表示する
 mProgressDialog = new ProgressDialog(mActivity);
 mProgressDialog.setMessage("Now Loading...");
 mProgressDialog.show();
 }

 // バックグラウンドにおける処理を担う。タスク実行時に渡された値を引数とする
 @Override
 protected RssListAdapter doInBackground(String... params) {
 RssListAdapter result = null;
 try {
 // HTTP経由でアクセスし、InputStreamを取得する
 URL url = new URL(params[0]);
 InputStream is = url.openConnection().getInputStream();
 result = parseXml(is);
 } catch (Exception e) {
 e.printStackTrace();
 }
 // ここで返した値は、onPostExecuteメソッドの引数として渡される
 return result;
 }

 // メインスレッド上で実行される
 @Override
 protected void onPostExecute(RssListAdapter result) {
 mProgressDialog.dismiss();
 mListView.setAdapter(result);
 }

 // XMLをパースする
 public RssListAdapter parseXml(InputStream is) throws IOException, XmlPullParserException {
 //パーサーを作成する。
 XmlPullParser parser = Xml.newPullParser();
 try {
 //パーサーにinputStraemをセットする。これはURLを読み込んでいるStream
 parser.setInput(is, null);

 //読み込みの進捗をここから取得ができる。(値はSTARTなどが存在する。)
 int eventType = parser.getEventType();
 Item currentItem = null;
 while (eventType != XmlPullParser.END_DOCUMENT) {
 String tag = null;
 switch (eventType) {
 case XmlPullParser.START_TAG:
 tag = parser.getName();
 if (tag.equals("item")) {
 currentItem = new Item();
 } else if (currentItem != null) {
 if (tag.equals("title")) {
 //タイトルタグの中身の文字の事
 currentItem.setTitle(parser.nextText());
 } else if (tag.equals("description")) {
 //説明タグの中身の文字の事
 currentItem.setDescription(parser.nextText());
 }
 }
 break;
 case XmlPullParser.END_TAG:
 tag = parser.getName();
 if (tag.equals("item")) {
 mAdapter.add(currentItem);
 }
 break;
 }
 eventType = parser.next();
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
 return mAdapter;
 }
}

Activityも次のように変更する必要があります。

package in.andante.rssReads;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class rssReads extends Activity {
 public static final String RSS_FEED_URL = "http://andante.in/i/feed/";
 private ArrayList mItems;
 private RssListAdapter mAdapter;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 // Itemオブジェクトを保持するためのリストを生成し、アダプタに追加する
 mItems = new ArrayList();
 mAdapter = new RssListAdapter(this, mItems);

 ListView _listview = (ListView)findViewById(R.id.listView1);

 //_listview.setAdapter(mAdapter);

 // タスクを起動する
 RssParserTask task = new RssParserTask(this, mAdapter,_listview);

 task.execute(RSS_FEED_URL);

 // サンプル用に空のItemオブジェクトをセットする
 /*for (int i = 0; i < 10; i++) {
 mAdapter.add(new Item());
 }*/
 }
}

以上で、次のように表示がされました。

読み込んでいるのはこのブログのRSSです。

rssReader

一番上のTextViewがいらない気がしました。。(最初に気づかなかったです。。すいません。)

前後の記事

前の記事:

次の記事:

関連の記事

コメントの投稿

  • サイト内検索

新作アプリの紹介

関連サイトの紹介

アンドロイドアプリ開発TIPS
きぐるみカメラ
ふらいぱん
アンドロイドのデザイン集
Page top↑