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 は次の通りです。
<?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 で要素の名前を取得して、 その名前毎に必要な情報を読み込んでいます。