作成 2002/10/29
Digester
DigesterはXML→Javaバインディングツールです。 XMLをパースして、内容をJavaオブジェクトに保存するための 簡単なAPIを提供しています。 設定ファイルを読み込む場合などに重宝します。 XML→Javaバインディングなので、Java→XMLということはできません。 バインディングツールとしては、他にJAXBなどもありますが、 使えるようになるのは来年以降でしょう。
実行には、commons-digesterのjarが必要です。 Jakartaからダウンロードします。 ここではバージョン1.3を使いました。
また、他に依存している以下のjarが必要です。
以下の簡単なXMLを読み込んでみます。
hoge.xml
<?xml version="1.0" encoding="Shift_JIS"?> <hoge> <foo name="foo1"> <message>foofoo</message> <bar name="bar1" age="10"/> <bar name="bar2" age="11"/> </foo> </hoge>
値を格納するbeanを作ります。
Hoge.java
public class Hoge { private Foo foo; public String toString(){ return super.toString() + ",foo=" + foo ; } public Foo getFoo() { return foo; } public void setFoo(Foo foo) { this.foo = foo; } }
ただのbeanです。子要素にFooを持ちます。
Foo.java
import java.util.*; public class Foo { private String message; private List bars = new ArrayList(); public String toString(){ return super.toString() + ",message=" + message + ",bars=" + bars ; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void addChild(Bar bar){ bars.add(bar); } public List getBars(){ return bars; } }
子要素に複数のBarを持ちたいので、 フィールドをリストにし、addChild()メソッドを定義しました。 他に、messageも持ちます。
Bar.java
public class Bar { private String name; private int age; public String toString(){ return super.toString() + ",name=" + name + ",age=" + age ; } public int getAge() { return age; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } }
これもただのbeanです。
toString()は値が入っていることを確認するためで、 必須ではありません。
でもって、実際にDigesterを使って、XMLをパースし、 読み込んでみます。
import java.io.*; import javax.xml.parsers.*; import org.apache.commons.digester.*; public class SimpleDigester { public static void main(String[] args) throws Exception{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); Digester digester = new Digester(parser); //hogeがきたらHogeを作る digester.addObjectCreate("hoge", Hoge.class); //hoge/fooがきたらFooを作る //hoge.setFoo(foo)する //foo.setXXX(*)する digester.addObjectCreate("hoge/foo", Foo.class); digester.addSetNext("hoge/foo", "setFoo"); digester.addSetProperties("hoge/foo"); //foge/foo/messageがきたら //foo.setMessage(messageテキスト) digester.addBeanPropertySetter("hoge/foo/message"); //hoge/foo/barがきたらBarを作る //foo.addChild(bar)する //bar.setXXX(*)する digester.addObjectCreate("hoge/foo/bar", Bar.class); digester.addSetNext("hoge/foo/bar", "addChild"); digester.addSetProperties("hoge/foo/bar"); //パースする InputStream in = new FileInputStream("src/digester/hoge.xml"); Hoge hoge = (Hoge)digester.parse(in); System.out.println(hoge); } }
addObjectCreate()で、インスタンスをつくり、 addSetNext()で、一つ上(のスタック)のオブジェクトのメソッドを呼び、 addSetProperties()で全ての属性を一括セットできます。
もっと細かくやるには、自分でRuleクラスを作るみたいです。
やることは簡単ですが、調べるのに苦労しました。サンプルが沢山あればいいのに。