XMLをパース(解析)する
|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