@634

Commons Digester - 定義ファイルを外部に記述する

Advertisement

XMLファイルにルールを定義する

Digesterでは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>

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;
    }
}

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;
    }
}

ルール定義XMLファイル

rule.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<digester-rules>

    <pattern value="books">
         <object-create-rule classname="Books" />
        <set-properties-rule/>
    </pattern>

    <pattern value="books/book">
         <object-create-rule classname="Book" />
        <set-properties-rule/>
    </pattern>

    <pattern value="books/book">
        <set-next-rule methodname="addBook" classname="Books"/>
    </pattern>

    <pattern value="books/book/price">
        <bean-property-setter-rule/>
    </pattern>

</digester-rules>

マッピングを行う。

CreateBooksObjectByXml.java
import java.io.File;
import java.util.List;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;

public class CreateBooksObjectByXml {

    public static void main(String[] args) throws Exception{
        // ルールが設定されたDigesterオブジェクトの生成
        File file = new File("resource/rule.xml");
        Digester digester = DigesterLoader.createDigester(file.toURL());

        // オブジェクト生成
        Books books = (Books)digester.parse("resource/sample.xml");
        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());
        }
    }
}
ソース内のルール定義よりも、すっきりとしたコードになった。

結果
i need coffee	\3,000
i love baby	\1,500

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール