Simpleという実にシンプルな名前のライブラリ
AndroidでXMLファイルを扱うには、SimpleというXMLバインドライブラリを使うのが一番簡単。
SimpleというのはXMLデータをPOJOにバインドするクラスライブラリで、次の特徴がある。
- スキーマレス
- XMLとPOJOを相互に変換できる
- ライブラリサイズが軽量
- 依存ライブラリが不要
SimpleはスキーマレスでPOJOとバインドできるので、
- スキーマなしでいきなりXMLファイルを書く
- XMLそっくりのJavaクラスを定義する
- 読み込む
という作業をするだけで、XMLデータをサクっとJavaクラスとして扱うことができるのである。
【雑談1】
AndroidでXMLファイルを扱うのは大変めんどくさい。
Android標準で使われるXMLファイル(layout.xmlやstring.xmlなど)の場合は「書けばおしまい」で、フレームワーク側がすべて面倒を見てくれる。
その便利さに慣れてしまっているので、いざ自前でSAX (StAX)やDOMでパースして自前でXMLを処理しようとすると、そのめんどくささに驚愕するわけだ。
昨今ではRubyやActionScriptといったXMLが扱いやすい言語が普及しているのでなおさらだ。そういう言語は、言語の物心がついたときにはすでにXMLが普及していたという「XMLネイティブ」な言語なので、昭和世代のお年寄り言語であるJavaはその点なかなか不利である。
XMLデータバインディングはだいぶ以前に大流行し、さまざまなライブラリやフレームワークが作られたのだが、Android世界ではほとんどロストテクノロジー化してしまった。
インストール
さっそくインストールしよう。
http://simple.sourceforge.net/download.phpからダウンロード。
最新版(今のところ2.6.2)をダウンロードしたら、適当なフォルダに展開する。
jarフォルダにあるsimple-xml-2.6.2.jarをプロジェクト内の適当な場所にコピーしてビルドパスに追加すればおしまいである。
libとか好きなフォルダを作ってそこにコピーすればいいんじゃないかな。
上記のjarファイルを選択して、右クリック>「ビルド・パス」>「ビルド・パスに追加」。
ところで、展開されたフォルダの中を見るとlibというフォルダにstax-1.2.0.jarやstax-api-1.0.1.jarなどのStAX関連のjarファイルが置かれている。
しかしAndroid SDKには標準でDOMパーサが用意されているので、これらのライブラリは不要(というか、Androidに対応していないのでそもそも使えない)。simple-xml-2.6.2.jarだけコピーすればよい。
【雑談2】
JavaでXMLバインディングというと、標準APIとしてJAXBが用意されている。しかし、JAXBはAndroidへの対応が不完全なのか、実行時に「Conversion to Dalvik format failed with error 1」というエラーが発生してしまってそのままではAndroidでは利用できない。
仮にがんばって使えるようにしたとしても、依存ライブラリがいくつも必要で、StackOverflowによれば、パッケージサイズが9MBも増えてしまうそうで、あんまりがんばる気になれない。
XMLファイルを生のリソースとして扱う
最初ちょっとはまったのだが、XMLファイルなのだからと思ってres/xmlフォルダに置いたところ、純粋なバイトストリームとして読み込むことができなかった。
いろいろ試したところ、res/xmlフォルダに置いてあるxmlファイルは、openRawResource()で開いても「生」のデータを取り出すことができず、よく分からないバイナリデータになってしまった。XmlResourceParserオブジェクトかなにかに自動的に変換されるんんだろうか?
そういうわけで、XMLファイルを直接扱う場合は、res/xmlではなくres/rawに置かなければならない。
基本的な使い方
それでは使ってみよう。書籍をあらわすbook.xmlというファイルを読み込んで、POJOに変換するという例。
1.XMLファイルを書く
スキーマは不要なので、XMLファイルを作成していきなりガリガリ書き始めればよい。
book.xml
杵渕 聡 2300
2.POJOクラスを定義する
POJOクラスを定義する。ルールは次の通り。
- ルートノードをあらわすクラスには@Rootというアノテーションを付加。
- フィールド名はタグ名と一致させ、@Elementというアノテーションを付加。
- 型は好きに定義すればよくて、ライブラリが変換処理を自動的にやってくれる。
Book.java
package jp.dcrew.book; import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; @Root public class Book { @Element public String name; @Element public String author; @Element public int price; }
3.読み込む
で、XMLを読み込んでJavaオブジェクトを作成する。
BookManagerActivity.java
package jp.dcrew.bookmanager; import java.io.InputStream; import android.app.Activity; import android.os.Bundle; import android.util.Log; import org.simpleframework.xml.core.Persister; public class BookManagerActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // res/book.xmlを生ファイルとして開く InputStream is = getResources().openRawResource(R.raw.book); Persister persister = new Persister(); Book book = null; try { // 読み込む book = persister.read(Book.class, is); } catch (Exception e) { } // ログに出力するなど Log.d( "", "book.name " + book.name ); Log.d( "", "book.author " + book.author ); Log.d( "", "book.price " + Integer.toString( book.price ) ); } }
Simpleという名に恥じず、定義も使い方もとにかくむっちゃシンプルである。これくらいシンプルだと、XMLの取り扱いが一気に気楽になる。
次はもうちょっと実用的な使い方を紹介する。フィールドにオブジェクトを使う方法やリストとして扱う方法、属性の扱いなど。
0 コメント:
コメントを投稿