アプリケーションから独自のXMLを読む

以前から使用していたXMLAndroidアプリケーションでも使いたい。
普通にJSDKのパーサを使って直接ファイルを読めばいいんだが、それでは面白くない。どうせならばAndroidの流儀で、Javaクラスに変換後バイナリ形式で保存されたリソースとしてハンドルで参照する方法でアクセスしたい。

  • 1. XMLファイルを用意する

使用したいXMLファイルをAndroidプロジェクト下のres/xmlに作成するかコピーする。

$PROJECT_ROOT
  |
  +--res
      |
      +--attr
      |
      +--layout
      |
      +--values
      |
      +--xml
          |
          +-- hogehoge.xml

(Androidはファイルの拡張子を気にしないため、.xmlという拡張子にする必要は無いようで、.configや.settingなども食ってくれる)
Eclipse + ADT Pluginで作ったAndroidプロジェクトを使用しているのならば、この操作と共に、hogehoge.xmlはバイナリに変換されて、R.Javaが変更されるだろう。

public final class R {
    public static final class attr { 〜 }
    public static final class color { 〜 }
    public static final class drawable { 〜 }
    public static final class id { 〜 }
    public static final class layout { 〜 }
    public static final class string { 〜}
    public static final class xml {
        public static final int hogehoge=0x7f040000;
    }

Asset Packaging Toolによりリソースに変換されたhogehogeに対するハンドルが追記されている。

  • 2. XMLを読み込む

抽象クラスContextを実装しているクラス(Activityクラスも勿論そうだ)であれば

    public abstract Resources getResources();

getResourcesメソッドで、上記のXMLを読み込むためのパーサを取得することができる。

    XmlResourceParser parser = getResources().getXml(R.xml.hogehoge);

XmlResourceParserはorg.xmlpull.v1.XmlPullParserを拡張しているため、StAXや本家XMLPullに慣れているプログラマは学習の必要も無いだろう。
XML Pull Parsing