Digester的使用(一)
以下内容出处:
Simplify XML file processing with the
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;
}
}
<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>
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
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。