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

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

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

    泰仔在線

    java學習,心情日記,繽紛時刻
    posts - 100, comments - 34, trackbacks - 0, articles - 0

    使用Apache的Digester來解析XML文檔

    Posted on 2007-06-07 17:26 泰仔在線 閱讀(4119) 評論(7)  編輯  收藏 所屬分類: Java 相關

    1.     概述

    解析XML文檔方面有不少的方法,也有不少的工具包可用,這里介紹的是來自Apache Jakarta的Digester,使用其解析XML文件非常方便而不需要過多的關心底層的具體解析過程。

    Digester最早出現在Struts中,后來隨著Struts的發展以及其的公用性而被提到commens中獨自立項,其底層實現的是SAX解析。當前版本為:1.5

    2.     正文

    1. 安裝與配置

    使用Digester需要如下幾個軟件包:

     Digester ,BeanUtils, Collections, Commens-Logging,還有一個遵循SAX(Simple API for XML)2.0或JAXP(Java API for XML Parsing) 1.1規范的XML解析器,如Xerces。相關下載地址見附錄。如果需要使用log4j做為日志輸出,則亦請下載之。

     

     將下載來的zip包解壓,并將其中的jar文件拷貝到你的工程文件的lib目錄中,并在工程classpath中包含上述jar文件的路徑。

    2.  XML文件

    在工程目錄下新建一個XML文件,示例使用DigesterTest.xml,內容見下:
    <?xml version="1.0" encoding="UTF-8" ?>
    <root>
        
    <!-- 這里是注釋 -->
        
    <events>
            
    <event>
                
    <date>
                    
    <![CDATA[2007年5月10日]]>
                
    </date>
                
    <address>
                    
    <![CDATA[江東影城]]>
                
    </address>
                
    <person>
                    
    <![CDATA[person1|person2|person3]]>
                
    </person>
                
    <title>
                    
    <![CDATA[《阪神×巨人戦》]]>
                
    </title>
            
    </event>
            
    <event>
                
    <date>
                    
    <![CDATA[2007年5月11日]]>
                
    </date>
                
    <address>
                    
    <![CDATA[江南水莊]]>
                
    </address>
                
    <person>
                    
    <![CDATA[person1|person2|person3]]>
                
    </person>
                
    <title>
                    
    <![CDATA[吃魚苗]]>
                
    </title>
            
    </event>
        
    </events>
        
        
    <configs>
            
    <config key="root.configs.config1" value="value1"/>
            
    <config key="root.configs.config2" value="value2"/>
            
    <config key="root.configs.config3" value="value3"/>
        
    </configs>
    </root>

    3.  解析XML文檔
       Digester使用相當簡單,請參看如下的DigesterTest類中的注釋
    package test;

    import java.io.IOException;

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

    /**
     * DigesterTest<br>
     * 用Digester簡化XML配置文件處理<br>
     * 2007-6-7 ver1.00 Yusx<br>
     * 
     * 
    @author Yusx
     * 
    @version 1.00
     
    */

    public class DigesterTest {

        
    private String configFile;
        
        
    /**
         * 設置XML文件路徑
         * 
    @param configFile 路徑
         
    */

        
    public void setConfigFile(String configFile) {
            
    this.configFile = configFile;
        }

        
        
    /**
         * 解析XML文件
         * 
    @throws IOException
         * 
    @throws SAXException
         
    */

        
    public void run() throws IOException, SAXException {
            
            
    // 新建Digester實例
            Digester digester = new Digester();
            
    // 將本實例放入Digester處理堆棧
            digester.push(this);
            
            
    /*
             * root/events/event: XML文件中的節點路徑
             * addEventInfo: 遇到到該節點時執行的方法
             *         addEventInfo 本類的一個方法
             *         4 調用 addEventInfo 方法需要傳入4個參數
             
    */

            digester.addCallMethod(
    "root/events/event""addEventInfo"4);
            
            
    /*
             * 逐個設置 addEventInfo 方法的參數,下標從0開始
             * 參數的值為對應節點 (root/events/event/date) 的值
             
    */

            digester.addCallParam(
    "root/events/event/date"0);
            digester.addCallParam(
    "root/events/event/address"1);
            digester.addCallParam(
    "root/events/event/person"2);
            digester.addCallParam(
    "root/events/event/title"3);
            
            
    // 開始解析XML文件
            digester.parse(this.configFile);
            
        }
    // end run()
        
        
    /**
         * 對XML參數進行處理
         *         本方法僅將XML文件中的內容簡單輸出,實際應用中可以將獲得的信息進行進一步的處理。
         * 
    @param date 時間
         * 
    @param address 地點
         * 
    @param person 人物
         * 
    @param title 事件title
         
    */

        
    public void addEventInfo(String date, String address, String person, String title) {
            
            System.out.println(
    "person=" + person + ",date=" + date
                    
    + ",address=" + address + ",title=" + title);

        }
    // end addEventInfo()
        
        
    /**
         * 對XML參數進行處理
         *         本方法僅將XML文件中的內容簡單輸出,實際應用中可以將獲得的信息進行進一步的處理。
         * 
    @param attr Attribute 對象
         
    */

        
    public void addAttributeInfo(Attribute attr) {
            
    // 調用 Attribute 對象的 toString() 方法 
            System.out.println(attr);
        }
    // end addAttributeInfo()

        
    /**
         * 
    @param args
         
    */

        
    public static void main(String[] args) {
            DigesterTest dt 
    = new DigesterTest();
            
    // 設置XML文件路徑
            dt.setConfigFile("DigesterTest.xml");        
            
    try {
                dt.run();
                dt 
    = null;
            }
     catch (IOException e) {
                e.printStackTrace();
            }
     catch (SAXException e) {
                e.printStackTrace();
            }

            
            
    //-----------------------------------------------------------------
            
    // 演示另一種解析方法
            Digester digester = new Digester();
            
    // 生成本類的實例
            digester.addObjectCreate("root/configs/config", DigesterTest.class);
            
            
    // 生成 Attribute 對象實例,對XML文件中root/configs/config節點的屬性進行封裝
            digester.addObjectCreate("root/configs/config", Attribute.class);
            
    /*
             * 獲取節點的屬性值,并將其存入Attribute實例
             *         key 對應節點的屬性名
             *         name 對應Attribute實例的屬性名
             
    */

            digester.addSetProperties(
    "root/configs/config""key""name");
            digester.addSetProperties(
    "root/configs/config""value""value");
            
    // 定義解析到對應節點(root/configs/config)時,調用本實例的 addAttributeInfo 方法
            digester.addSetNext("root/configs/config""addAttributeInfo");
            
    try {
                
    // 開始解析XML文件
                digester.parse("DigesterTest.xml");
            }
     catch (IOException e) {
                e.printStackTrace();
            }
     catch (SAXException e) {
                e.printStackTrace();
            }

        }
    // end main()

    }


    附Attribute.java的代碼
    package test;

    public class Attribute {
        
        
    private String name = null;
        
        
    private String value = null;

        
    public String getName() {
            
    return name;
        }


        
    public void setName(String name) {
            
    this.name = name;
        }


        
    public String getValue() {
            
    return value;
        }


        
    public void setValue(String value) {
            
    this.value = value;
        }

        
        
    public String toString() {
            
    return "name=" + this.name + " value=" + this.value;
        }

    }

    Digester,BeanUtils,Collections,Commens-logging下載地址:
          http://jakarta.apache.org/commons/digester/

    Feedback

    # re: 使用Apache的Digester來解析XML文檔  回復  更多評論   

    2007-06-30 14:46 by huwd
    寫得很好,非常喜歡.,支持并感謝.!!!!!

    # re: 使用Apache的Digester來解析XML文檔  回復  更多評論   

    2007-11-15 15:24 by sgwood
    按照你寫得文章,我卻產生了下面的異常:
    java.net.MalformedURLException: no protocol: DigesterTest.xml
    at java.net.URL.<init>(URL.java:567)
    at java.net.URL.<init>(URL.java:464)
    at java.net.URL.<init>(URL.java:413)
    at org.apache.commons.digester.Digester.createInputSourceFromURL(Digester.java:1958)
    at org.apache.commons.digester.Digester.parse(Digester.java:1804)
    at DigesterTest.main(DigesterTest.java:62)

    # re: 使用Apache的Digester來解析XML文檔  回復  更多評論   

    2007-11-15 15:33 by sgwood
    我用的包有:commons-digester-1.8.jar
    commons-beanutils-1.6jar
    commons-collections-2.1.1.jar
    log4j-1.2.211.jar
    commons-logging-1.0.4.jar
    commons-logging-api-1.1.jar
    xerces-2.6.2.jar
    請指教,謝謝

    # re: 使用Apache的Digester來解析XML文檔  回復  更多評論   

    2007-11-16 13:43 by kxx129
    應該不會啊,我這上面的代碼都在jdk1.5下跑的通過了的啊
    你這貼出來的信息太少,我也不知道問題在哪?
    但有一點:
    你的報錯信息:java.net.MalformedURLException: no protocol: DigesterTest.xml

    你的測試的xml文件也叫:DigesterTest.xml 嗎?目錄結構如何?
    我測試時,這個是我的xml文件的名字,路徑就在src的根目錄下,你再看看!

    # re: 使用Apache的Digester來解析XML文檔  回復  更多評論   

    2007-11-16 13:49 by kxx129
    還有,你的xml文件是用什么編輯的啊?文件的編碼是什么的啊?
    我當時是在Eclipse下面編寫的,文件編碼是utf-8的,這個你也看一下!

    # re: 使用Apache的Digester來解析XML文檔  回復  更多評論   

    2008-02-25 09:58 by sgwood
    好久沒來了.謝謝了,問題還是解決了

    # re: 使用Apache的Digester來解析XML文檔  回復  更多評論   

    2008-03-03 19:27 by mei9771
    在1.8版本中,那個parse方法的參數必須是URL或String的uri,因此,在windows下必須要在前面加上file:///
    主站蜘蛛池模板: 亚洲AV乱码久久精品蜜桃| 亚洲色大成WWW亚洲女子| 亚洲毛片免费观看| 亚洲国产无线乱码在线观看| 亚洲人成人无码网www国产| 久久免费观看国产99精品| 亚洲午夜无码毛片av久久京东热| 免费午夜爽爽爽WWW视频十八禁| 在线成人精品国产区免费| 亚洲AV成人噜噜无码网站| 久久精品国产亚洲AV不卡| 国产va免费精品观看精品| 9i9精品国产免费久久| 亚洲综合色7777情网站777| 国产精品亚洲产品一区二区三区| 永久在线免费观看| 国产精品极品美女自在线观看免费 | 91人人区免费区人人| 国产成人高清亚洲一区久久| 亚洲大片在线观看| 免费在线观看理论片| 99久久久国产精品免费牛牛| 美女被免费网站视频在线| 久久精品国产亚洲av影院| 亚洲?v无码国产在丝袜线观看| 99国产精品视频免费观看| 免费看一级高潮毛片| 亚洲国产成人久久三区| 亚洲精品亚洲人成人网| 国产无遮挡色视频免费视频| 99爱在线观看免费完整版| 一级毛片**免费看试看20分钟| 亚洲人成伊人成综合网久久| 好看的电影网站亚洲一区 | 亚洲高清在线mv| 亚洲日韩在线观看免费视频| 免费无码A片一区二三区| 久久成人无码国产免费播放| 成人福利在线观看免费视频| 亚洲av永久无码| 99999久久久久久亚洲|