Digester的使用(一)

以下内容出处:

Simplify XML file processing with the Jakarta Commons Digester

http://www.javaworld.com/javaworld/jw-10-2002/jw-1025-opensourceprofile.html

XML解析的概念

解析XML有两个基本方法,一个是DOM(Document Object Model)解析,这个方法把XML文件看做一颗树,把整个文档读入内存来解析。另一个方法就是SAX()解析,这种解析是依据事件来解析XML文件的。

先来了解Digester的一些相关概念。[www.iocblog.net 来源]

Digester使用SAX来解析XML文档,但是直接使用SAX比较复杂,所以Digester提供了一些高级API来处理SAX事件,从而为开发人员减轻负担。

 

Digester引入了三个重要的概念:元素匹配模式、处理规则和对象栈。

 

元素匹配模式使XML元素和规则处理相关联,举一个例子:

<datasources>          'datasources'
  <datasource>         'datasources/datasource'
    <name/>            'datasources/datasource/name'
    <driver/>          'datasources/datasource/driver' 
  </datasource>
  <datasource>         'datasources/datasource'
    <name/>            'datasources/datasource/name'
    <driver/>          'datasources/datasource/driver' 
  </datasource>
</datasources>

每次只要有一个模式匹配(datasource模式与我们的XML文件中的datasources元素匹配),那个一个相关的规则就被调用。因此上面的例子中’datasources/datasource’模式对象的规则就会执行两次。

规则处理顾名思义,就是当Digester发现了匹配的模式后,我应该干什么。Digester预定义了一套处理规则。如果需要自定义规则,我们只需要继承org.apache.commons.digester.Rule就可以了。

 

对象栈就是规则处理中需要操作的对象。对象既可以手动也可以通过规则处理从栈中添加或删除(push,pop)

 

使用Digester

还是使用上面的XML文件,我们来看看怎样使用Digester

首先,我们需要实例化一个Digester对象,把需要的对象添加到对象栈中,然后添加一系列处理规则,最后解析这个文件。

具体代码如下:

/*

 *

 */

package test;

 

import java.util.HashSet;

import java.util.Iterator;

 

import org.apache.commons.digester.Digester;

 

/**

 *

 * @see

 * @author Andi Liu

 *

 */

public class SimpleDigester

{

 

       private static HashSet datasources = new HashSet();

 

       public void run() throws Exception

       {

              Digester digester = new Digester();

              digester.push(this);

              digester.addCallMethod("datasources/datasource","addDataSource",5);

              digester.addCallParam("datasources/datasource/name",0);

              digester.addCallParam("datasources/datasource/driver",1);

              digester.addCallParam("datasources/datasource/url",2);

              digester.addCallParam("datasources/datasource/username",3);

              digester.addCallParam("datasources/datasource/password",4);

             

              digester.parse("E:/datasource.xml");

 

       }

       public void addDataSource(

              String name,

              String driver,

              String url,

              String username,

              String password)

       {

              DataSource source = new DataSource();

              source.setName(name);

              source.setDriver(driver);

              source.setUrl(url);

              source.setUsername(username);

              source.setPassword(password);

              datasources.add(source);

       }

 

       public static void main(String[] args) throws Exception

       {

              SimpleDigester di = new SimpleDigester();

              di.run();

 

              for (Iterator it = datasources.iterator(); it.hasNext();)

              {

                     DataSource data = (DataSource) it.next();

                     System.out.println("Name = " + data.getName());

                     System.out.println("Driver = " + data.getDriver());

                     System.out.println("Url = " + data.getUrl());

                     System.out.println("Username = " + data.getUsername());

                     System.out.println("Password = " + data.getPassword());

              }

       }

}

 

/*

 *

 */

package test;

 

/**

 *

 * @see

 * @author Andi Liu

 *

 */

public class DataSource

{

       private String name;

       private String driver;

       private String url;

       private String username;

       private String password;

 

       public void setName(String name)

       {

              this.name = name;

       }

 

       public String getName()

       {

              return name;

       }

 

       public void setDriver(String driver)

       {

              this.driver = driver;

       }

 

       public String getDriver()

       {

              return driver;

       }

 

       public void setUrl(String url)

       {

              this.url = url;

       }

 

       public String getUrl()

       {

              return url;

       }

 

       public void setUsername(String username)

       {

              this.username = username;

       }

 

       public String getUsername()

       {

              return username;

       }

 

       public void setPassword(String password)

       {

              this.password = password;

       }

 

       public String getPassword()

       {

              return password;

       }         

}

 

完整XML文件:datasource.xml

<?xml version="1.0"?>
<datasources>
  <datasource>
    <name>HsqlDataSource</name>
    <driver>org.hsqldb.jdbcDriver</driver>
    <url>jdbc:hsqldb:hsql://localhost</url>
    <username>sa</username>
    <password></password>
  </datasource>
  <datasource>
    <name>OracleDataSource</name>
    <driver>oracle.jdbc.driver.OracleDriver</driver>
    <url>jdbc:oracle:thin:@localhost:1521:orcl</url>
    <username>scott</username>
    <password>tiger</password>
  </datasource>
</datasources>

 

程序执行结果

Name = HsqlDataSource
Driver = org.hsqldb.jdbcDriver
Url = jdbc:hsqldb:hsql://localhost
Username = sa
Password =
Name = OracleDataSource
Driver = oracle.jdbc.driver.OracleDriver
Url = jdbc:oracle:thin:@localhost:1521:orcl
Username = scott[www.iocblog.net 来源]
Password = tiger




文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。