RSSリーダーやWebAPIを使ったアプリを作りたいときに、XMLを解析したいということが出てくると思います。
今回はAndroidでXMLをパースする方法を説明します。Androidではライブラリを追加すること無く解析を行うことができます。
JSONを扱うWebAPIもありますので後日JSONも説明しようと思います。
それでは続きへどうぞ。
XmlPullParser
XMLをパースするにはXmlPullPaerserを使います。XmlPullPaerserを使いますが通常のインスタンスを生成するようにnew XmlPullPaerserとするのではなく、Xmlクラス(android.utilパッケージ内)のnewPullParserメソッドを使ってインスタンスを取得します。
XmlPullParser xmlPullParser = Xml.newPullParser();
そしてこのインスタンスにsetInputメソッドで解析するXMLを指定します。指定の方法は2つあります。
- setInput(Reader in)
- setInput(InputStream inputStream, String inputEncoding)
文字列データを指定する場合は前者を、Web上のXMLデータであるURLを指定する場合は後者を使います。
文字列を解析する
まずは前者の文字列を指定する方法を説明します。以下のサンプルソースはAndroidDevelopersのサンプルを少し修正したものになります。
XmlPullParser xmlPullParser = Xml.newPullParser();
try {
xmlPullParser.setInput( new StringReader ( "<TAG1>hoge<TAG2>foo</TAG2></TAG1>" ) );
} catch (XmlPullParserException e) {
Log.d("XmlPullParserSample", "Error");
}
try {
int eventType;
eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if(eventType == XmlPullParser.START_DOCUMENT) {
Log.d("XmlPullParserSample", "Start document");
} else if(eventType == XmlPullParser.END_DOCUMENT) {
Log.d("XmlPullParserSample", "End document");
} else if(eventType == XmlPullParser.START_TAG) {
Log.d("XmlPullParserSample", "Start tag "+xmlPullParser.getName());
} else if(eventType == XmlPullParser.END_TAG) {
Log.d("XmlPullParserSample", "End tag "+xmlPullParser.getName());
} else if(eventType == XmlPullParser.TEXT) {
Log.d("XmlPullParserSample", "Text "+xmlPullParser.getText());
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
Log.d("XmlPullParserSample", "Error");
}
ますはgetEventTypeメソッドでイベントタイプを取得して、次にnextメソッドで一行ずつ進めて行きます。
イベントの種類と意味は一部ですが下記にまとめておきます。
イベントタイプ
| イベントタイプ | 意味 |
|---|---|
| XmlPullParser.START_DOCUMENT | ドキュメントの開始 |
| XmlPullParser.END_DOCUMENT | ドキュメントの終わり |
| XmlPullParser.START_TAG | 開始タグ |
| XmlPullParser.END_TAG | 終了タグ |
| XmlPullParser.TEXT | 要素 |
URLを指定して解析する
URLを指定してWeb上のXMLファイルを解析してみます。
URLConnectionクラスのインスタンスを生成します。そしてそのインスタンスからInputStreamを取得して指定します。文字コードも忘れずに指定しましょう。
setInput(InputStream inputStream, String inputEncoding)
インターネットに接続するのでAndroidManifest.xmlパーミッションの設定も忘れずに。
<uses-permission android:name="android.permission.INTERNET"/>
今回はTechBoosterのRSSフィードからタイトルを表示するサンプルソースを作ってみました。
イベントタイプがXmlPullParser.START_TAGの場合(=開始タグの場合)にgetNameメソッドでタグの名前を取得して、目的であるタイトルを取得するためにタグが「title」の場合のみ次のテキスト(=要素)を取得してログに出力しています。
try{
XmlPullParser xmlPullParser = Xml.newPullParser();
URL url = new URL("https://techbooster.org/?feed=rss2");
URLConnection connection = url.openConnection();
xmlPullParser.setInput(connection.getInputStream(), "UTF-8");
int eventType;
while ((eventType = xmlPullParser.next()) != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG && "title".equals(xmlPullParser.getName())) {
Log.d("XmlPullParserSampleUrl", xmlPullParser.nextText());
}
}
} catch (Exception e){
Log.d("XmlPullParserSampleUrl", "Error");
}
こちらが出力されたログです。
最後にAndroidDevelopersのリンクを載せておきます。
http://developer.android.com/intl/ja/reference/org/xmlpull/v1/XmlPullParser.html