2012年1月16日

AndroidでXMLを扱う一番簡単な方法(1)

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クラスを定義する。ルールは次の通り。

  1. ルートノードをあらわすクラスには@Rootというアノテーションを付加。
  2. フィールド名はタグ名と一致させ、@Elementというアノテーションを付加。
  3. 型は好きに定義すればよくて、ライブラリが変換処理を自動的にやってくれる。

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 コメント:

コメントを投稿

長崎県 引越 見積もり 単身引っ越し 料金 還暦祝い 父 Blog Entry Ranking
" ); 出会い系を例示