マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

XmlPullParserを使う

とりあえず勉強中のAndroidでのプログラミング。XMLの解析をしてみたくなったのでXmlPullParserを使ってRSS2.0のエントリのタイトル一覧を取得して表示をやってみた。今回はhttp://d.hatena.ne.jp/d-kami/rss2から取得した。追記: ちなみにAndroid 2.2からはXPathが使えるので、そっちの方が楽かも[Android]AndroidでXPath

package test.rss;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
import android.util.Xml;

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

import java.util.List;
import java.util.ArrayList;
import java.net.URL;
import java.net.URLConnection;
import java.net.MalformedURLException;
import java.io.IOException;

public class RSSView extends View implements Runnable{
    //エントリのタイトルのリスト
    private List<String> titleList;
    //取得するRSSのURL
    private static final String RSS_URL = "http://d.hatena.ne.jp/d-kami/rss2";
    //接続先の文字コード
    private static final String CHARACTER_CODE = "UTF-8";
    
    public RSSView(Context context){
        super(context);
        titleList = new ArrayList<String>();
        setBackgroundColor(Color.WHITE);

        //RSSを取得するスレッドの開始
        Thread thread = new Thread(this);
        thread.start();
    }
    
    public void run(){
        try{
            XmlPullParser parser = Xml.newPullParser();
            //URLを指定して接続
            URL url = new URL(RSSView.RSS_URL);
            URLConnection connect = url.openConnection();
            parser.setInput(connect.getInputStream(), RSSView.CHARACTER_CODE);
            
            int eventType;
            while((eventType = parser.next()) != XmlPullParser.END_DOCUMENT){
                //itemタグを見つけたらaddItemへ
                if(eventType == XmlPullParser.START_TAG && "item".equals(parser.getName())){
                    addItem(parser);
                }
            }
        }catch(MalformedURLException e){
            titleList.add(e.getMessage());
        }catch(XmlPullParserException e){
            titleList.add(e.getMessage());
        }catch(IOException e){
            titleList.clear();
            titleList.add(e.getMessage());
        }
        
        postInvalidate();
    }
    
    private void addItem(XmlPullParser parser)
            throws XmlPullParserException, IOException{

        while(true){
            int eventType = parser.next();

            //itemのエンドタグを見つけたらループ終了
            if(eventType == XmlPullParser.END_TAG && "item".equals(parser.getName())){
                break;
            }

            //titleタグを見つけたらテキストを取り出す
            if(eventType == XmlPullParser.START_TAG && "title".equals(parser.getName())){
                eventType = parser.next();
                
                if(eventType == XmlPullParser.TEXT){
                    titleList.add(parser.getText());
                }
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas){
        int y = 16;
        Paint paint = new Paint();

        //タイトル一覧を描画する。エラーメッセージが入ってることもある
        for(String title : titleList){
            canvas.drawText(title, 0, y, paint);
            y += 16;
        }
    }
}