@634

Commons Digester - マッピング

Advertisement

XMLファイルの読み込み。

前提

ここでは以下のXMLを利用する。
sample.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<books>
    <book name="i need coffee">
        <price>\3,000</price>
    </book>
    <book name="i love baby">
        <price>\1,500</price>
    </book>
</books>

Digesterでは、どのXMLとJavaクラスをどのようにマッピングするかというルールを開発者が指定できるため、Javaクラスは完全なPOJOで記述することができる。

ここでは一つの本を表すBookクラスと、その集まりを保持するBooksクラスを定義した。

Book.java
public class Book {
    private String name = null;
    private String price = null;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
}
プロパティとsetter/getterのみ。

Books.java
import java.util.ArrayList;
import java.util.List;

public class Books {
    List books = null;

    public Books(){
        this.books = new ArrayList();
    }

    public void addBook(Book book){
        books.add(book);
    }
    
    public List getBooks(){
        return this.books;
    }
}
同じくプロパティとsetter/getterのみ。

マッピングする。

CreateBooksObject.java
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.commons.digester.Digester;

public class CreateBooksObject{

    public static void main(String[] args) throws Exception{

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        Digester digester = new Digester(parser);

        // ルールの設定
        digester.addObjectCreate("books", Books.class);
        digester.addObjectCreate("books/book", Book.class);
        digester.addSetProperties("books/book");
        digester.addSetNext("books/book", "addBook");    
        digester.addBeanPropertySetter("books/book/price");

        // インスタンス生成
        InputStream in = new FileInputStream("resource/sample.xml");
        Books books = (Books)digester.parse(in);
        List bookList = books.getBooks();
        for(int i = 0; i < bookList.size(); i++){
            Book book = (Book)bookList.get(i);
            System.out.println(book.getName() + "\t" + book.getPrice());
        }
    }
}
手順は以下のとおり。
  1. Digesterクラスのインスタンスを生成。
  2. ルールを設定する。
  3. Digesterによって生成されたインスタンスを受け取る。
結果
i need coffee	\3,000
i love baby	\1,500

ルール

定義済みルールの一覧はDigester APIドキュメント内のRuleクラスより、サブクラス一覧を参照。

主なルール
ルール定義
ObjectCreateRuleオブジェクト生成
SetPropertiesRuleすべての属性をプロパティにセット
BeanPropertySetterRuleすべてのテキストノードをプロパティにセット

Advertisement

ショートカット

634
634blog
このカテゴリのトップページに戻る
634labs
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール

ビリヤード