超哥說歡迎留言
          超哥說歡迎留言,超哥說歡迎調錯,超哥說歡迎批評,超哥說歡迎指正,超哥說*&%%^$^%#$%$#@ 讀者說,你丫閉嘴!讓不讓人看了!再窮叨叨,抽你丫的!!

          commons-digester-1.7.jar

          1、功能簡述:解析xml文件;

           

          2、環境配置:所需要用到的jar包÷

            Digester的運行依賴下列包:

          一個遵循Jaxp(1.1版本及以后)的XML解析器 xerces.jar     

          Jakarta commons beanutils包 commons-beanutils.jar (1.5版本及以后)

          Jakarta commons collections包 commons-collections-3.1.jar(2.1版本及以后)

          Jakarta commons logging包 commons-logging-1.0.4.jar(1.0.2版本及以后)
           
          一個簡單的例子  
          3、使用限制:無平臺限制(沒有測試過)


          4、是否可進行封裝:可以進行封裝,但我沒試過


          5、調用思路:
             讀取配置文件時使用。


          6、代碼示例:

          本代碼囊括了xml的大多數基本情況包括屬性值(如:penson的id)單一節點值(如:name),混合節點值(如:email)

           

          ***********Example.xml**********
          <address-book>
            <person id="1" category="acquaintance" try="would be ignored">
              <name>Gonzo</name>
              <email type="business">gonzo@muppets.com</email>
              <gender result="the whole tag would be ignored">male</gender>
            </person>
            <person id="2" category="rolemodel">
              <name>Kermit</name>
              <email type="business">kermit@muppets.com</email>
              <email type="home">kermie@acme.com</email>
            </person>
          </address-book>**********Person.java************
          import java.util.HashMap;
          import java.util.Iterator;
          public class Person {
            private int id;
            private String category;
            private String name;
            private HashMap emails = new HashMap();
            //下面的兩個方法的名字中set以后的部分,與<person>的屬性名字對映。當從xml文件中識別出<person>的屬性時,如果有要求(即調用過addSetProperties方法),Digester會依據這種對映關系自動調用相應的方法。
            public void setId(int id) {
                this.id = id;
            }
            public void setCategory(String category) {
                this.category = category;
            }
            //對name而言,因為其值來自<name>標簽的內容而非屬性值,需要用addCallMethod指定識別<name>后的要調用此方法(想自動調用也要可以,需要addBeanPropertySetter,參見第下一個例子)。
            public void setName(String name) {
                this.name = name;
            }
            //同name,此時還要一一指定addEmail的參數值的來源。
            public void addEmail(String type, String address) {
                emails.put(type, address);
            }
            public void print() {
                System.out.println("Person #" + id);
                System.out.println("  category=" + category);
                System.out.println("  name=" + name);
                for(Iterator i = emails.keySet().iterator(); i.hasNext(); ) {
                    String type = (String) i.next();
                    String address = (String) emails.get(type);
                    System.out.println("  email (type " + type + ") : " + address);
                }
            }
          }
          **********AddressBook.java***********
          import java.util.LinkedList;
          import java.util.Iterator;
          public class AddressBook {
              LinkedList people = new LinkedList();
              public void addPerson(Person p) {
                  people.addLast(p);
              }
              public void print() {
                  System.out.println("Address book has " + people.size() + " entries");

                  for(Iterator i = people.iterator(); i.hasNext(); ) {
                      Person p = (Person) i.next();
                      p.print();
                  }
              }
          }
          ************AddressBookDigester*********
          import org.apache.commons.digester.Digester;
          /**
           * Usage: java Example1 example.xml
           */
          public class AddressBookDigester {
              public static void main(String[] args) {
                  if (args.length != 1) {
                      usage();
                      System.exit(-1);
                  }
                  String filename = args[0];
                  // 創建一個Digester實例
                  Digester d = new Digester();
                  // 創建AddressBook實例,并將其壓入棧頂。
                  AddressBook book = new AddressBook();
                  d.push(book);
                  // 增加規則
                  addRules(d);
                  // 處理輸入的xml文件
                  try {
                      java.io.File srcfile = new java.io.File(filename);
                      d.parse(srcfile);
                  }
                  catch(java.io.IOException ioe) {
                      System.out.println("Error reading input file:" + ioe.getMessage());
                      System.exit(-1);
                  }
                  catch(org.xml.sax.SAXException se) {
                      System.out.println("Error parsing input file:" + se.getMessage());
                      System.exit(-1);
                  }
                 
                 
                  // 將解析出的地址數據打印出來
                  book.print();
              }
             
              private static void addRules(Digester d) {
                  // 當遇到<person>時,創建類Person的一個實例,并將其壓入棧頂
                  d.addObjectCreate("address-book/person", Person.class);
                 
                  // 將<person>標簽的屬性(attribute)與棧頂Person類對象的屬性(property)設置方法根據各自的名字進行映射,(例如,將標簽屬性id與屬性設置方法setId進行映射,將標簽屬性category與屬性設置方法setCategory進行映射),然后將屬性的值作參數傳遞給執行相應的方法。
                  // 如果某標簽屬性沒法通過名字找到相應的屬性設置方法,則此標簽屬性被忽略(如example.xml中第一個<person>的try屬性)。
                  d.addSetProperties("address-book/person");

                  // 調用第二棧頂對象(AddressBook實例)的addPerson方法,以棧對象(Person實例)的對象為參數
                  d.addSetNext("address-book/person", "addPerson");       
                 
                  // 當遇到<person>的子元素<name>時,調用棧頂對象(Person實例)的setName方法。
                  // 此處addCallMethod方法的第一參數是規則,第二個參數是方法的名字,第三個是參數的數量(為0時,表示只有一個參數,且參數的值是元素的內容)
                  d.addCallMethod("address-book/person/name", "setName", 0);
                 
                  // 當遇到<person>的子元素<email>時,調用棧頂對象(Person實例)的addEmail方法,addEmail方法有兩個參數,取值分別來自<email>的屬性type的值和<email>本身的內容。
                  // 此處addCallParam方法的第一參數是規則,第二個參數是指明被調用方法(addEmail)參數的序號,第三個是參數為字符串時指屬性的名字)
                  d.addCallMethod("address-book/person/email", "addEmail", 2);
                  d.addCallParam("address-book/person/email", 0, "type");
                  d.addCallParam("address-book/person/email", 1);
              }

              private static void usage() {
                  System.out.println("Usage: java Example1 example.xml");
              }
          }

          Address book has 2 entries
          Person #1
            category=acquaintance
            name=Gonzo
            email (type business) : gonzo@muppets.com
          Person #2
            category=rolemodel
            name=Kermit
            email (type business) : kermit@muppets.com
            email (type home) : kermie@acme.com

          posted on 2005-11-30 15:47 超人 閱讀(1739) 評論(2)  編輯  收藏
          Comments
          • # re: commons-digester-1.7.jar 的使用
            看官
            Posted @ 2006-03-26 14:52
            頂!
            好鐵!  回復  更多評論   
          • # re: commons-digester-1.7.jar 的使用
            dreamstone
            Posted @ 2007-08-11 22:11
            digester還是挺好用的,比如配合lucene做索引的時候  回復  更多評論   

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          主站蜘蛛池模板: 南丹县| 分宜县| 武山县| 襄城县| 汕尾市| 娄烦县| 东至县| 昭觉县| 会昌县| 泸定县| 阿拉尔市| 安图县| 瑞安市| 岳阳市| 乌鲁木齐县| 浠水县| 长泰县| 额尔古纳市| 包头市| 开原市| 三江| 兴业县| 华容县| 娄烦县| 宜川县| 团风县| 滦平县| 越西县| 崇仁县| 丰宁| 余干县| 砚山县| 忻州市| 枣阳市| 曲水县| 历史| 宿迁市| 乐陵市| 榆中县| 漾濞| 佛教|