XMLをパース(解析)する
|RSSリーダーやWebAPIを使ったアプリを作りたいときに、XMLを解析したいということが出てくると思います。
今回はAndroidでXMLをパースする方法を説明します。Androidではライブラリを追加すること無く解析を行うことができます。
JSONを扱うWebAPIもありますので後日JSONも説明しようと思います。
それでは続きへどうぞ。
XmlPullParser
XMLをパースするにはXmlPullPaerserを使います。XmlPullPaerserを使いますが通常のインスタンスを生成するようにnew XmlPullPaerserとするのではなく、Xmlクラス(android.utilパッケージ内)のnewPullParserメソッドを使ってインスタンスを取得します。
1 | XmlPullParser xmlPullParser = Xml.newPullParser(); |
そしてこのインスタンスにsetInputメソッドで解析するXMLを指定します。指定の方法は2つあります。
- setInput(Reader in)
- setInput(InputStream inputStream, String inputEncoding)
文字列データを指定する場合は前者を、Web上のXMLデータであるURLを指定する場合は後者を使います。
文字列を解析する
まずは前者の文字列を指定する方法を説明します。以下のサンプルソースはAndroidDevelopersのサンプルを少し修正したものになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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を取得して指定します。文字コードも忘れずに指定しましょう。
1 | setInput(InputStream inputStream, String inputEncoding) |
インターネットに接続するのでAndroidManifest.xmlパーミッションの設定も忘れずに。
1 | < uses-permission android:name = "android.permission.INTERNET" /> |
今回はTechBoosterのRSSフィードからタイトルを表示するサンプルソースを作ってみました。
イベントタイプがXmlPullParser.START_TAGの場合(=開始タグの場合)にgetNameメソッドでタグの名前を取得して、目的であるタイトルを取得するためにタグが「title」の場合のみ次のテキスト(=要素)を取得してログに出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | try { XmlPullParser xmlPullParser = Xml.newPullParser(); 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