とりあえず勉強中の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; } } }