泰仔在線

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

          使用Apache的Digester來解析XML文檔

          Posted on 2007-06-07 17:26 泰仔在線 閱讀(4125) 評論(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:///
          主站蜘蛛池模板: 江阴市| 安平县| 阿拉善左旗| 漳州市| 南平市| 磐石市| 宽甸| 铜川市| 莆田市| 滦南县| 合江县| 盈江县| 盐山县| 启东市| 定边县| 望江县| 衡山县| 天水市| 万载县| 乃东县| 金昌市| 白水县| 娱乐| 明光市| 林西县| 邯郸市| 元朗区| 平安县| 中卫市| 古蔺县| 永康市| 东光县| 腾冲县| 马龙县| 江陵县| 玉环县| 景东| 青岛市| 遂宁市| 甘泉县| 密云县|