ムッシューの日記

2人の子供とのお出かけネタから趣味の釣りネタなど

AndroidアプリでXMLファイルを解析する方法


Javaでサーバサイドのアプリを作る時は、XMLパースにはSTAXとかJAXBとかそういったものを使うのですが、どうやらAndroidアプリでは使えないようです。

代わりにAndroidではXmlPullParserというクラスが用意されています。
使い方は以下のような感じで、プル型のXMLパーサになります。

// XMLファイルのインプットストリーム取得(ZIPファイル内のファイルを読むサンプル)
ZipInputStream zis = new ZipInputStream(am.open(FILE_NAME));
ZipEntry entry;
if ((entry = zis.getNextEntry()) == null) {
 zis.close();
 return null;
}
// XmlPullParserFactoryのインスタンス取得
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true); //namespaceをサポートする場合はtrueにする。デフォルトはfalse
factory.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, true); // ParserにFeatureをセットする場合かここで記載

// XmlPullParserのインスタンス取得
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(zis, "UTF-8");

// ここからXMLを解析していく
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
 if (eventType == XmlPullParser.START_DOCUMENT) {
 System.out.println("Start document");
 } 
 else if (eventType == XmlPullParser.START_TAG) {
 System.out.println("Start tag " + xpp.getName());
 } 
 else if (eventType == XmlPullParser.END_TAG) {
 System.out.println("End tag " + xpp.getName());
 } 
 else if (eventType == XmlPullParser.TEXT) {
 System.out.println("Text " + xpp.getText());
 }
 eventType = xpp.nextToken(); // xpp.next()かどちらかを使う
}

〇設定できるFEATURE

Factoryまたはパーサで設定出来る要素は以下の通り(デフォルトはfalse)

  • FEATURE_PROCESS_DOCDECL
    trueの場合、DTDの解析をparserがやってくれるになります。そのため、nextTokenメソッドでDOCDECLイベントタイプが発生しなくなります。
  • FEATURE_PROCESS_NAMESPACES
    trueの場合、名前空間の解析をparserがやってくれるようです
    FactoryのsetNamespaceAwareメソッドも裏でこれのtrue/falseを切り替えているようです
  • FEATURE_REPORT_NAMESPACE_ATTRIBUTES
    名前空間の接頭語を取得できるようにする
  • FEATURE_VALIDATION
    trueの場合、XML1.0に違反している場合、例外が発生するようになります。FEATURE_PROCESS_DOCDECL もtrueにする必要があります。

〇nextメソッドとnextTokenメソッドの違い

以下のような違いがあるようです。parserに解析を任せたい場合はnext()を使って、あまりparserに任せず自分で解析処理を書く場合はnextToken()といった使い分け方な気がします。

  1. nextTokenの方がイベントタイプが多い
    nextTokenの方がイベントタイプが多く、XMLのより低レイヤな処理ができます。nextよりも多いイベントタイプは以下。
    next: START_TAG、TEXT、END_TAG、END_DOCUMENT
    nextToken: nextのイベントに加えて、COMMENT、 CDSECT、 DOCDECL、 ENTITY_REF、 PROCESSING_INSTRUCTION、IGNORABLE_WHITESPACE
  2. nextは実態参照(&など)を展開してくれる

次へ 投稿

前へ 投稿

© 2017 ムッシューの日記

テーマの著者 Anders Norén