XMLの解析方法

XMLファイルを使うと構造を持たせてデータを定義できるので便利です。

そのXMLファイルを読み込んで要素属性などを抜き出す方法を紹介します。

XMLファイルの用意

まず読み込みたいXMLファイルを用意します。

list.xml
<petList>
    <name id="001"type="dog">Poti</name>
    <name id="002"type="cat">Tama</name>
    <name id="003"type="bird">Pippi</name>
</petList>

例えば例として上のような名前リストを作りました。

先頭につく<?xml>から始まるXML宣言は読み込む側でXMLだと分かっていればつける必要はありません。

また、XMLを保存するときはUTF-8N(BOM無し)で保存します。

XMLファイルの解析

用意したXMLファイルを読み込んで解析するにはXMLPullParserクラスを使用します。

これを使えば、例えば要素と属性を次のように簡単に一覧表示できます。

try {
    String listXmlPath = getFilesDir().getAbsoluteFile() + "/image_list.xml";
    String content = new Scanner(
            new File(listXmlPath)).useDelimiter("\\z").next();
        //XMLファイルをまとめて読み込み
    XmlPullParser xpp = Xml.newPullParser();

    xpp.setInput(new StringReader(content));
        //解析するXMLファイルの中身を渡す
    int eventType = xpp.getEventType();
    while(eventType != XmlPullParser.END_DOCUMENT){
        switch(eventType){
        case XmlPullParser.START_DOCUMENT:
            Log.i("MainActivity", "ドキュメント開始");
            break;
        case XmlPullParser.START_TAG:
            Log.i("MainActivity", xpp.getName() + "要素開始");
            int attrCount = xpp.getAttributeCount();
            for(int i = 0; i < attrCount; ++i){
                Log.i("MainActivity", "    " +
                     i + "番目の属性 = " + xpp.getAttributeName(i));
            }
            break;
        case XmlPullParser.TEXT:
            Log.i("MainActivity", "テキスト = " + xpp.getText());
            break;
        case XmlPullParser.END_TAG:
            Log.i("MainActivity", xpp.getName() + "要素終了");
            break;
        }
        eventType = xpp.next();
            //次のトークンに進む
    }
    Log.i("MainActivity", "ドキュメント終了");
} catch (XmlPullParserException e) {
    Log.e("MainActivity", "XMLの解析失敗.");
}catch(IOException e){
    Log.e("MainActivity", "XMLファイルの読み込みに失敗.");
}

用意したXMLファイルをこの方法で解析したら次のようなログになりました。

XMLファイルの解析ログ

XmlPullParsersetInputメソッドにはStringReaderしか渡せないようなので初めにXMLファイルの内容を全てテキストとしてまとめて読み込んでいます。

その後、1つ1つの要素やテキストなどを順番に読み進めていって解析しています。

属性については要素の開始地点から順番にその要素にある属性を取得すればOKです。

関連項目
プライバシーポリシー