Let's go inside

          this blog is deprecated as a result of laziness.
          posts - 59, comments - 2, trackbacks - 0, articles - 0

          實戰(zhàn)-Digester的基本使用

          Posted on 2006-07-18 12:20 Earth 閱讀(342) 評論(0)  編輯  收藏 所屬分類: Java

          這里是在Eclipse下的展開圖:
          TestDigester.jpg?
          下載源代碼download

          今天初學了一下Digester,并把它在Eclipse下跑了一遍,呵呵。學會開始用ant來構建任務了。發(fā)現(xiàn)如同JBuilder一樣也可以直接在TestDigester上使用Alt+Shift+X來運行main函數(shù),不錯。
          網(wǎng)上的例子只有一個大致的皮毛,我把這個foo ,bar的例子實際實現(xiàn)了一遍(后來發(fā)現(xiàn)Digester src包中給我們提供了幾個更好的例子,不錯)。使用Digester的步驟大致如下:

          ???????? // 首先要new一個Digester對象
          ????????Digester?digester? = ? new ?Digester();
          ????????
          ????????
          // ?不進行XML與相應的DTD的合法性驗證
          ????????digester.setValidating( false );
          ????????
          ????????
          // ?當遇到<foo>時創(chuàng)建一個test.Foo對象,并將其放在棧頂
          ????????digester.addObjectCreate( " foo " ,? " test.Foo " );
          ????????
          ????????
          // ?根據(jù)<foo>元素的屬性(這里是name),對剛創(chuàng)建的Foo對象的屬性(這里也是name)進行設置
          ????????
          // ?注:xml中的屬性稱為attribute,對象中的屬性稱為property
          ????????digester.addSetProperties( " foo " );

          ????????
          // 當遇到<foo>的子元素<bar>時創(chuàng)建一個test.Bar對象,并將其放在棧頂。
          ????????digester.addObjectCreate( " foo/bar " ,? " test.Bar " );
          ????????
          ????????
          // 根據(jù)<bar>元素的屬性,對剛創(chuàng)建的Bar對象的屬性進行設置,這里有兩個:分別是id和title
          ????????digester.addSetProperties( " foo/bar " );
          ????????
          ????????
          // 當再次遇到<foo>的子元素<bar>時創(chuàng)建一個test.Bar對象,并將其放在棧頂,同時調(diào)用第二棧頂元素(Foo對象)的addBar方法。?
          ????????digester.addSetNext( " foo/bar " ,? " addBar " ,? " test.Bar " );

          ????????ClassLoader?classLoader?
          = ?Thread.currentThread()
          ????????????????.getContextClassLoader();
          ????????InputStream?in?
          = ?classLoader.getResourceAsStream( " Foobar.xml " );
          ????????Foo?foo?
          = ? null ;
          ????????
          try ? {
          ????????????
          if ?(in? != ? null )? {
          ????????????????foo?
          = ?(Foo)?digester.parse(in); // 分析結束后,返回根元素。
          ????????????}

          ????????}
          ? catch ?(IOException?e)? {
          ????????????e.printStackTrace();
          ????????}
          ? catch ?(SAXException?e)? {
          ????????????e.printStackTrace();
          ????????}

          元素匹配模式
           Digester能自動遍歷目標XML文檔的元素形成的層次結構,這個過程無須程序員參與。程序員的任務是,決定在解析的過程中,當由嵌套的元素形成的一個特定序列被識別出時如何進行處理。用以描述這種序列的機制,這就叫元素匹配模式。
           當檢索的元素序列滿足某個匹配模式時,與該模式相對應的行為就會被自動執(zhí)行。
           對于元素模式,具體來說,就是元素和子元素間,通過“/”分隔并連接在一起,對于根元素之前則無需使用“/”。例如:
          <a> -- 匹配模板 "a"
           <b> -- 匹配模板 "a/b"
            <c/> -- 匹配模板 "a/b/c"
            <c/> -- 匹配模板 "a/b/c"
           </b>
           <b> -- 匹配模板 "a/b"
            <c/> -- 匹配模板 "a/b/c"
            <c/> -- 匹配模板 "a/b/c"
            <c/> -- 匹配模板 "a/b/c"
           </b>
          </a>
          字符”*”表示任意級別,如”*/a”表示任意級別的<a>都可匹配(不包括根元素級的).
          處理規(guī)則
          元素匹配模式用于確定什么時候進行處理,而處理規(guī)則則用于定義處理的內(nèi)容,也就是進行什么樣的行動。
          Digester定義了一系列的常用的處理規(guī)則。在設置Digester時,可能通過調(diào)用addRule()方法來注冊一個特定的元素匹配模式以及一個相應的處理規(guī)則類的實例。
           用戶也可以自定義一些自己的處理規(guī)則類,用于滿足不同類型的特殊需求。定義一個處理規(guī)則首先要擴展org.apache.commons.digester.Rule類。然后再根據(jù)特殊的要求來實現(xiàn)begin(), body(), end(), finish()事件處理方法。

          對于一些標準的規(guī)則類,可以創(chuàng)建它們的實例,并調(diào)用digester.addRule來注冊它們。由于經(jīng)常使用它們,所以digester定義了一些簡便的方法來注冊它們。如:
          Rule rule = new SetNextRule(digester, "addChild","com.mycompany.mypackage.MyChildClass");
          digester.addRule("a/b/c", rule);
          可以用下列代碼替換
          digester.addSetNext("a/b/c", "addChild", "com.mycompany.mypackage.MyChildClass");

          在前面的foo, bar例子中,從log4j打印出的信息可以窺見它所用到的處理規(guī)則
          ? New match='foo'
          [ObjectCreateRule]{foo}New test.Foo
          [SetPropertiesRule]{foo} Setting property 'name' to 'The Parent'

          ? New match='foo/bar'
          [ObjectCreateRule]{foo/bar}New test.Bar
          [SetPropertiesRule]{foo/bar} Setting property 'id' to '123'
          [SetPropertiesRule]{foo/bar} Setting property 'title' to 'The First Child'
          [SetNextRule]{foo/bar} Call test.Foo.addBar(test.Bar@30c221[id=123,title=The First Child])

          主站蜘蛛池模板: 渝中区| 电白县| 青州市| 瑞丽市| 福清市| 綦江县| 临潭县| 陇西县| 鄂托克旗| 阜新市| 松溪县| 龙口市| 吉水县| 东阿县| 龙里县| 衡南县| 行唐县| 阳原县| 华宁县| 江都市| 临汾市| 温泉县| 宿州市| 沙坪坝区| 溧水县| 渑池县| 吴江市| 枣阳市| 阿合奇县| 武强县| 肥西县| 兴国县| 河源市| 揭阳市| 姚安县| 四川省| 德格县| 上林县| 安远县| 论坛| 同心县|