Digester Including programmatically-created rules: 의 고찰

황제낙엽 2008.05.14 19:32 조회 수 : 12 추천:119

sitelink1  
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  
사용자 정의 Rule을 xmlrule로 등록하는 방법이다.

Including programmatically-created rules:

때때로 via XML을 쉽게 정의하기 힘들때가 있다. 프로그램적으로 생성된 Rule set은 digester-rules XML 파일에 포함될 수 있다.
이것은 class 속성을 가지는 < include > element를 사용하여 수행된다. class 속성에 정의하는 클래스는 org.apache.commons.digester.xmlrules.DigesterRulesSource
인터페이스를 상속받는다.
이 인터페이스는 하나의 메서드를 정의하고 있는데 getRules(Digester) 이다. 이 메서드는 rule을 생성하고 추가하는 역할을 가진다.
The pattern concatenation(패턴 연관) works exactly as if the rules had been included from an XML file. Example:

      File rules3.xml:
         < ?xml version="1.0"? >
         < !DOCTYPE digester-rules SYSTEM "digester-rules.dtd" >
         < digester-rules >
           < pattern value="root/foo" >
             < object-create-rule classname="Foo"/ >
             < include class="BarRuleCreator"/ >
           < /pattern >
         < /digester-rules >

BarRuleCreator class 정의:
          public class BarRuleCreator implements DigesterRulesSource {
              public void getRules(Digester digester) {
                  digester.addObjectCreate("bar", "Bar");
              }
          }

rules3.xml 을 파싱하는 것은 rules1.xml처럼 다음 같은 결과를 산출한다.
    root/foo -> ObjectCreateRule(Foo)
    root/foo/bar -> ObjectCreateRule(Bar)
위와 같은식으로 사용시 주의할 점은
xml파일에 정의하는 pattern에 대응하는 범위는 1레벨밖에 지원할 수 없다는 것이다.
가령 위에 정의된 파싱할 xml데이터는 "root/foo/bar" 의 깊이를 가지고 있고,
xml에 정의된 pattern에서는 "root/foo" 로써 rule 클래스에서는 "root/foo/bar" 패턴일 경우 Bar객체를 생성하도록 정의하였으나,
"bar" 이하의 깊이 만약 "root/foo/bar/sel" 이라는 패턴이 있다면, 상단의 rule 클래스에서는 "root/foo/bar/sel"패턴에 대응하는 rule을 작성할 수 없다.
만일 "root/foo/bar/sel"패턴에 대응하는 rule을 작성하려면 새로운 클래스와 xml에도 라인 몇개가 추가되어야 한다.
         < ?xml version="1.0"? >
         < !DOCTYPE digester-rules SYSTEM "digester-rules.dtd" >
         < digester-rules >
           < pattern value="root/foo" >
             < object-create-rule classname="Foo"/ >
             < include class="BarRuleCreator"/ >
             < pattern value="bar" >
               < include class="SelRuleCreator"/ >
             </pattern>
           < /pattern >
         < /digester-rules >