XmlPullParserを使って、XMLをパースして配列に入れてみた。ほぼ解説

http://www.ibm.com/developerworks/jp/xml/library/x-android/#list10
パースの仕方はもちろんのこと、変数の定義場所・初期化する場所、あとは明示的にパースを終了させるあたりなんかが、すげー参考なりました


PHPer なので、すごく困惑したパースになった
その原因は XmlPullParser.next()
このメソッドで、開始タグ、attributes、中身、終了タグという順番でパーサーのカーソル(っていうの?)を進めるようだ
その中で、今が「foo」タグであれば、その中の attributes を取得するっていう具合でパースを進めることになる


とりあえずサンプルとして、以下のものに格納していきますが、しっかりとインスタンスに入れていくのがいいと思います

List<Map<String, String>>

今からすること

  • こんなXMLのパースをする
<points>
    <point lat="35" lng="135">
        <image>foo.png</image>
    </point>
    <point lat="36" lng="136">
        <image>bar.png</image>
    </point>
</points>
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

public class Foo {

	public ArrayList<HashMap> parse() {
		ArrayList<HashMap> points = null;
		final XmlPullParser xmlPullParser = Xml.newPullParser();
		try {
			xmlPullParser.setInput(this.getInputStream(), null);
			HashMap point = null;
			int eventType = xmlPullParser.getEventType();
			boolean done = false;
			while (eventType != XmlPullParser.END_DOCUMENT && !done) {
				String name = null;
				switch (eventType) {
				case XmlPullParser.START_DOCUMENT:
					points = new ArrayList<HashMap>();
					break;
				case XmlPullParser.START_TAG:
					name = xmlPullParser.getName();
					if (name.equalsIgnoreCase("POINT")) {
						point = new HashMap();
						point.put("lat",
								xmlPullParser.getAttributeValue(null, "lat"));
						point.put("lng",
								xmlPullParser.getAttributeValue(null, "lng"));
					} else if (point != null) {
						if (name.equalsIgnoreCase("IMAGE")) {
							point.put("image", xmlPullParser.nextText());
						}
					}
					break;
				case XmlPullParser.END_TAG:
					name = xmlPullParser.getName();
					if (name.equalsIgnoreCase("POINT") && point != null) {
						points.add(point);
					} else if (name.equalsIgnoreCase("POINTS")) {
						done = true;
					}
					break;
				default:
					break;
				}
				eventType = xmlPullParser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return points;
	}
}