XmlPull を利用した XML ファイルの解析

Xml Pull パーサー (Xml Pull Parser, XPP) を使うと簡単に XML を解析して、情報を取り出すことが可能になります。

直感的にわかりやすく利用できるのが私は気に入っています。

ちなみに XPP は Android SDK などでも利用可能なので、Android で RSS リーダーを作るとか、 何か XML の扱いが必要になったときに利用を検討すると良いでしょう。

XmlPull の実装のひとつ - kXML を利用

XmlPull の実装としては、いくつか種類があります。ひとつはインディアナ大学の Aleksander Andrzej Slominski 氏による XPP3/MXP1、 もうひとつは Stefan Haustein 氏による kXML です。

ここでは kXML を利用します。 http://kxml.sourceforge.net/ からライブラリをダウンロードしてください。

Eclipse ではプロジェクトのプロパティから Java Build Path から "Add External JARs..." をクリックしてダウンロードした jar を選択すれば OK です。

XmlPull を利用した XML ファイルの解析例

それではここでは具体的な XML を例にとって、XmlPull を利用した XML の解析例を示します。

ここで使う XML は次の通りです。

Eclipse で JAR を追加

<?xml version="1.0" encoding="UTF-8"?>
<PersonalInfo>
  <Name First="Keisuke" Last="Oyama"/>
  <Cars>
    <Car name="Sentra" make="Nissan"/>
    <Car name="Sienna" make="Toyota"/>
  </Cars>
  <Age>38</Age>
</PersonalInfo>

これを XmlPull でどのように読むか、試してみましょう。

Java コードは次のようになります。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class XmlTest1 {
  public static void main(String[] args) {
    try {
      // XML ファイルを String に読み込む
      BufferedReader fReader = new BufferedReader(
        new FileReader(
          "test.xml のパスはここ"
        )
      );
      StringBuffer xmlBuffer = new StringBuffer();
      String line;
      while((line = fReader.readLine()) != null){
        xmlBuffer.append(line.trim());
      }
      
      System.out.println(xmlBuffer.toString());
      
      // XML の解析
      XmlPullParserFactory factory 
        = XmlPullParserFactory.newInstance();
      factory.setNamespaceAware(true);
      XmlPullParser xpp = factory.newPullParser();
      xpp.setInput(new StringReader(xmlBuffer.toString()));

      String elementName;
      int eventType = xpp.getEventType();
            
      while (eventType != XmlPullParser.END_DOCUMENT) {
        if(eventType == XmlPullParser.START_DOCUMENT) {
          // 何もしない (ドキュメントの始まり)
        } else if(eventType == XmlPullParser.START_TAG) {
          elementName = xpp.getName();
          // 要素毎の読み込み方それぞれ
          if(elementName.equals("Name")){
            for(int i=0; i<xpp.getAttributeCount(); i++){
              System.out.println(
                xpp.getAttributeName(i) 
                + " = " 
                + xpp.getAttributeValue(i)
              );
            }
          }
          else if(elementName.equals("Age")){
            eventType = xpp.next();
            if(eventType == XmlPullParser.TEXT){
              System.out.println("Age = " + xpp.getText());
            }            
          }
          else if(elementName.equals("Cars")){
            eventType = xpp.next();
            elementName = xpp.getName();
            while(elementName.equals("Car") 
              && eventType == XmlPullParser.START_TAG){
              for(int i=0; i<xpp.getAttributeCount(); i++){
                System.out.println(
                  "Car: "
                  + xpp.getAttributeName(i) 
                  + " = " 
                  + xpp.getAttributeValue(i)
                );
              }
              eventType = xpp.next();
              elementName = xpp.getName();
            }
          }
        }
        eventType = xpp.next();  
      }
      
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (XmlPullParserException e) {
      e.printStackTrace();
    }
  }
}

この実行例は次の通りです。

< ?xml version="1.0" encoding="UTF-8" ?><PersonalInfo...
First = Keisuke
Last = Oyama
Car: name = Sentra
Car: make = Nissan
Age = 38

確かに XML 要素の情報が取得できています。

この例ではまず XML ファイルを String に読み込み、それを XmlPull パーサに渡しています。

xpp オブジェクトの next メソッドで要素を次々にたどって行きます。getName で要素の名前を取得して、 その名前毎に必要な情報を読み込んでいます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門