Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

4. ルールのXML化

2005.09.20 株式会社四次元データ 宮澤了祐

4.1. ルールのXML化

ルール自体をXMLファイルにすることが出来ます。 これによりXMLのスキーマが変更されてもプログラムを変更する必要なくなります。
以降、パターンとルールをXMLで指定する方法について説明します。

<pattern value="パターン>
    <ルール .../>
</pattern>

<ルール pattern="パターン" ...>
ルールは、ルールの名前を次の法則で変換したものが入ります。
  1. 名前を小文字にする。
  2. 単語毎にハイフンで繋ぐ。

例えば<param1>パラメーター1</param1>というパターンをBeanのtextというプロパティに設定するルールの場合、 Javaでは

digester.addBeanPropertySetter("param1","text");

と記述しますが、XMLにすると

<pattern value="param1">
    <bean-property-setter-rule propertyname="text" />
</pattern>

または

<bean-property-setter-rule pattern="param1" propertyname="text" />

と記述します。 また<pattern>タグを使用する場合は、入れ子にすることが出来ます。

<pattern value="parent">
    <ルール .../>
</pattern>

<pattern value="parent/child">
    <ルール .../>
</pattern>

は次と同義です。

<pattern value="parent">
    <ルール .../>

    <pattern value="child">
        <ルール .../>
    </pattern>
</pattern>

以下は、2章で使用したXMLを読み込むルールをXML化した例です。

sample.xml
1:<object>
2:    <param1>param1</param1>
3:    <param2>param2</param2>
4:    
5:    <parent>
6:        <child>child</child>
7:    </parent>
8:</object>
samplerule.xml - ルールを記述したXMLファイルです。
<?xml version = "1.0" encoding = "euc-jp" ?>
<digester-rules>

<pattern value="object">
    <object-create-rule classname="techscore.DigesterBean" />
    
    <!--object/parentのルール-->
    <pattern value="parent">
        <object-create-rule classname="techscore.Parent" />
        <set-next-rule methodname="setParent" />
        
        <pattern value="child">
            <bean-property-setter-rule />
        </pattern>
        
    </pattern>
    
    <!--param1の設定-->
    <pattern value="param1">
        <bean-property-setter-rule />
    </pattern>

</pattern>

<!--param2の設定-->
<pattern value="object/param2">
    <bean-property-setter-rule />
</pattern>

</digester-rules>

要素はpatternタグのvalue属性に記述し、その内部にルールを記述します。 ルールはJavaのクラス名を小文字にしてハイフンで繋いだ形になります。 また、patternタグは入れ子にすることが出来ます。
上記のルールを元にXMLファイルを読み込むプログラムのソースです。

import java.io.File;
import java.io.IOException;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.xml.sax.SAXException;

public class MyDigester {

    public static void main(String[] args) throws IOException, SAXException {
        
        Digester d = DigesterLoader.createDigester(new File("techscore/samplerule.xml").toURL());
        
        DigesterBean bean = (DigesterBean)d.parse(new File("techscore/sample.xml"));
        
        System.out.println(bean.toString());
    }
}

ルールの記述が完全に取り除かれていることがわかります。



前のページへ TECHSCOREのTOPページへ 次のページへ
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa