1)digester.setValidating( false );
不验证XML的头部信息
2)digester.addObjectCreate( "addresses", Addresses.class );
建立一个数据存储对象,对象为Addresses.class就是刚才那个Addresses.java的对象
由于Addresses为最外层的节点,所以最先创建。
3)digester.addObjectCreate( "addresses/address", Address.class );
digester.addBeanPropertySetter( "addresses/address/addressLine1", "addressLine1" );
digester.addBeanPropertySetter( "addresses/address/addressLine2", "addressLine2" );
digester.addSetNext( "addresses/address", "addAddress" );
1、然后创建在Addresses下面的子节点Address
2、利用addBeanPropertySetter读节点去相应XML节点的信息,第一个参数为:处于XML文件的位置 。 第二个参数为:对象Bean中存储此节点信息的属性名。它一般用于提取,信息这种XML格式中的信息。
3、addSetNext为跳出此节点,并自动调用方法addAddress,此函数一般都是利用自动调用的方法把子节点信息存储到父节点对象中去。此例子为,把Address的信息存储到Addresses的集合中。
4)digester.addObjectCreate( "addresses/person", Person.class );
digester.addBeanPropertySetter( "addresses/person/name", "name" );
同上面一样,建立对象Person , 存储相应XML节点中的信息,到指定的属性中。
5)digester.addObjectCreate( "addresses/person/detail", Detail.class );
digester.addSetProperties( "addresses/person/detail", "age", "age" );
digester.addBeanPropertySetter( "addresses/person/detail/education" );
digester.addSetNext( "addresses/person/Detail", "addDetail" );
digester.addSetNext( "addresses/person", "addPerson" );
1、在Person下,建立一个对象Detail,
2、addSetProerties ,此方法主要用于提取如下XML格式中的信息:
其中第一个参数为XML节点的位置、第二个参数为XML文件中的属性名称、第三个参数为存储Bean中存储此信息的属性名称 。
3、把Detail对象信息加入到其父节点Person的集合中。
4、把Person对象信息加入到其父节点Addresses的集合中。
6)Addresses address = (Addresses)digester.parse( "WEB-INF/address.xml" );
最后指定要解析的XML文件的路径和名称。
19:38 添加评论 固定链接 引用通告 (0) 记录它 jakarta项目
固定链接http://esaymail.spaces.live.com/blog/cns!67F90B74E85EB0A4!107.entry
添加评论学习Digester笔记(一)
首先Digester是什么,它是用来解析xml文件的的工具,是jakarta开源项目下commons的一个子项目,它能让程序员更方便的解析xml文件,而不需要了解底层的工作细节。
如果要使用Digester作为xml文件的解析,请到jakarta项目下
http://jakarta.apache.org/commons/digester,下载Digester的类库。
下面我主要以实例做讲解:
首先假定有一database.xml的文件,文件内容如下:
mysqldatasource
com.jdbc.mysql.Driver
jdbc:mysql://localhost:3306/test
root
1234
oracledatasource
oracle.jdbc.driver.oracledriver
jdbc
racle:thin:@localhost:1521
rcl
scott
tiger
可以看出,此xml文件分2层结构,分别为:
节点 其下包含2个节点
节点,其下包含各种信息节点 : 如: 、等。
我们的操作目标是把datasource中的信息节点的内容提取出来。
把每个看做为一个对象,中信息节点的内容为对象中的元素。
设定一个类Datasource.java 其内容如下:
public class Datasource {
private String name;
private String driver;
private String url;
private String username;
private String password;
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
下面我们要写一个类SampleDigester,来解析database.xml文件
SampleDigester代码如下:
package com.bluesky;
import java.io.IOException;
import java.util.Vector;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
import com.sun.security.sasl.preview.SaslException;
public class SampleDigester
{
private Vector datasources = null ;
public Vector getDatasources() {
return datasources;
}
public void setDatasources(Vector datasources) {
this.datasources = datasources;
}
public void run() throws IOException, SaslException {
Digester digester = new Digester();
datasources = new Vector() ;
//把当前对象压入到digester栈中。
digester.push(this);
/** 设定解析此xml文件的规则 */
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);
try {
// 确定解析目标
digester.parse("WEB-INF/database.xml"
;
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public void adddatasource(String name, String driver, String url,
String username, String password) {
Datasource data = new Datasource();
data.setName(name);
data.setUrl(url);
data.setUsername(username);
data.setPassword(password);
getDatasources().add(data) ;
}
}
注意主要负责xml文件解析的,为底色为黄色的代码部分:
1)://把当前对象压入到digester栈中。
digester.push(this);
2) 确认解析那个xml层次的元素,此例子为解析datasources/dataspirce节点下的元素,其中“adddatasource”,为自定义函数, 5表示datasources/dataspirce节点下有5个元素要解析。
digester.addCallMethod("datasources/datasource", "adddatasource", 5);
3)那5个节点元素的名称,与adddatasource函数的位置。例如:datasources/datasource/name,在函数adddatasource对应的装载位置为0,对应的变量名name
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);
第2步与第3步的执行,就把xml文件解析完毕,并且组装到对象Datasource data中。
下面写个主函数调用SampleDigester类
package com.bluesky;
import java.io.IOException;
import com.sun.security.sasl.preview.SaslException;
public class TT {
public static void main(String[] args) {
SampleDigester digest = new SampleDigester();
try {
digest.run() ;
} catch (SaslException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
|