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

4 Comments