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; } }