<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Let's go inside

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

    實戰-Digester的基本使用

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

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

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

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

    ????????
    // 當遇到<foo>的子元素<bar>時創建一個test.Bar對象,并將其放在棧頂。
    ????????digester.addObjectCreate( " foo/bar " ,? " test.Bar " );
    ????????
    ????????
    // 根據<bar>元素的屬性,對剛創建的Bar對象的屬性進行設置,這里有兩個:分別是id和title
    ????????digester.addSetProperties( " foo/bar " );
    ????????
    ????????
    // 當再次遇到<foo>的子元素<bar>時創建一個test.Bar對象,并將其放在棧頂,同時調用第二棧頂元素(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文檔的元素形成的層次結構,這個過程無須程序員參與。程序員的任務是,決定在解析的過程中,當由嵌套的元素形成的一個特定序列被識別出時如何進行處理。用以描述這種序列的機制,這就叫元素匹配模式。
     當檢索的元素序列滿足某個匹配模式時,與該模式相對應的行為就會被自動執行。
     對于元素模式,具體來說,就是元素和子元素間,通過“/”分隔并連接在一起,對于根元素之前則無需使用“/”。例如:
    <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>都可匹配(不包括根元素級的).
    處理規則
    元素匹配模式用于確定什么時候進行處理,而處理規則則用于定義處理的內容,也就是進行什么樣的行動。
    Digester定義了一系列的常用的處理規則。在設置Digester時,可能通過調用addRule()方法來注冊一個特定的元素匹配模式以及一個相應的處理規則類的實例。
     用戶也可以自定義一些自己的處理規則類,用于滿足不同類型的特殊需求。定義一個處理規則首先要擴展org.apache.commons.digester.Rule類。然后再根據特殊的要求來實現begin(), body(), end(), finish()事件處理方法。

    對于一些標準的規則類,可以創建它們的實例,并調用digester.addRule來注冊它們。由于經常使用它們,所以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打印出的信息可以窺見它所用到的處理規則
    ? 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])

    主站蜘蛛池模板: 亚洲三级在线观看| 国产V亚洲V天堂无码久久久| 亚洲无mate20pro麻豆| 131美女爱做免费毛片| 亚洲精品成人av在线| 99久久免费观看| 亚洲制服丝袜精品久久| 亚州免费一级毛片| 亚洲一区二区免费视频| 午夜性色一区二区三区免费不卡视频| 亚洲精品91在线| 最近中文字幕免费mv视频7| 亚洲国产午夜精品理论片在线播放| 成人免费视频观看无遮挡| 日本系列1页亚洲系列| 亚洲高清成人一区二区三区| 一级免费黄色毛片| 亚洲av日韩av高潮潮喷无码| 国产国产人免费视频成69堂| 亚洲AV无码男人的天堂| 亚洲视频在线一区二区| 黄网站色视频免费在线观看的a站最新| 精品亚洲aⅴ在线观看| 97无码免费人妻超级碰碰碰碰| 亚洲av无码无线在线观看| 中文字幕亚洲日韩无线码| 免费无码成人AV在线播放不卡| 亚洲一级大黄大色毛片| 日韩一级免费视频| a在线免费观看视频| 亚洲一区二区三区在线观看蜜桃| 精品国产免费观看一区| 一级毛片高清免费播放| 亚洲系列国产精品制服丝袜第| 日韩免费无砖专区2020狼| 中文在线免费观看| 亚洲三级在线视频| 亚洲一区精品伊人久久伊人| 99精品视频免费在线观看| 亚洲av乱码一区二区三区按摩 | 永久免费bbbbbb视频|