commons-digesterメモ

Javaはコードは読めるけどあまり使う機会がないので、
ポピュラーなライブラリであっても使うのに四苦八苦!


今回はcommons-digesterにハマったのでメモしておく。


一口でいうと、XML⇒Object変換ツール。
DOMとかでゴリゴリやるのに比べて比較的簡単に変換することができる。
Struts発祥なんだとか。


で、こんなXMLから部分をUserオブジェクトに、かつはMapで保持、とかするには

<root>
  <id>1</id>
  <user>
    <firstName>アラレ</firstName>
    <lastName>則巻</lastName>
    <options>
      <option name="gender">female</option>
      <option name="hoge">fuga</option>
    </options>
  </user>
</root>

こんな感じみたい

Digester d = new Digester();

// root/user見つけたらUserインスタンス作って
d.addObjectCreate("root/user", User.class);
// root/user/firstName見つけたらfirstNameを設定・lastNameも同様
d.addBeanPropertySetter("root/user/firstName");
d.addBeanPropertySetter("root/user/lastName");
// optionsが現れたらHashMap作成
d.addObjectCreate("root/user/options", HashMap.class);
// optionが現れたら、put()メソッド呼ぶ。引数は2個。
d.addCallMethod("root/user/options/option", "put", 2);
// name属性と
d.addCallParam("root/user/options/option", 0, "name");
// 値部分
d.addCallParam("root/user/options/option", 1);
// ひとつ上のstackのsetOptions() でMapを登録
d.addSetNext("root/user/options", "setOptions");

URL xmlFile = DigesterSimpleListSample.class.getResource("in_test.xml");
User user = (User) d.parse(xmlFile);

System.out.println(ToStringBuilder.reflectionToString(user));

パース部分はXMLの設定ファイルで書くこともできて、
そうするとソースに手を加えずに…ということができるみたい。

でもこれをXMLで表現することは私には難しかった。