`
soft901
  • 浏览: 36374 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Digester解析XML文件

阅读更多
待读取的XML文件datasource.xml:
<?xml version="1.0"?>
<datasources>
	<datasource>
		<name>mysqldatasource</name>
		<driver>com.jdbc.mysql.Driver</driver>
		<url>jdbc:mysql://localhost:3306/test</url>
		<username>root</username>
		<password>1234</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>


此xml文件分2层结构,分别为:
<datasources>节点 其下包含2个<datasource>节点
<datasource>节点,其下包含各种信息节点 : 如:<name> 、<url>等。
我们的操作目标是把datasource中的信息节点的内容提取出来。
把每个<datasource>看做为一个对象,<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;
	}
	
	public String toString() {
		return "DataSource : " + "name : " + name + " Driver : " + driver
				+ " URL : " + url + " Username : " + username + " Password : "
				+ password;
	}
}


解析这个XML文件,新建一个类SampleDigester.java:
使用addCallMethod方法,映射XML所对应的节点与这个Call method的参数即可,这个call method将读取的一个标签内所有的值存入对象,然后再存入一个集合中.
import java.io.IOException;
import java.util.Vector;

import org.apache.commons.digester.Digester;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.SAXException;

/**
 * class SampleDigester
 * 
 * @author xiaoqing.yu
 */
public class SampleDigester {

	/** log */
	protected static final Log log = LogFactory.getLog(SampleDigester.class);

	/** dataSources */
	private Vector<DataSource> dataSources;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SampleDigester sd = new SampleDigester();
		sd.digester();
		log.info(sd.toString());
	}

	private void digester() {
		Digester digester = new Digester();

		setDataSources(new Vector<DataSource>());
		// 把当前对象压入到digester栈中。
		digester.push(this);
		/* 设定解析此xml文件的规则 */
		// 将XML文件解析所对应的方法.this.addDataSource();参数个数为5个.
		digester.addCallMethod("datasources/datasource", "addDataSource", 5);
		// 对应方法addDataSource参数1,final String 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);
		
		try {
			digester.parse("datasource.xml");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}

	public void addDataSource(final String name, final String driver,
			final String url, final String username, final String password) {
		DataSource dataSource = new DataSource();
		dataSource.setName(name);
		dataSource.setDriver(driver);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		getDataSources().add(dataSource);
	}

	/**
	 * @return the dataSources
	 */
	public Vector<DataSource> getDataSources() {
		return dataSources;
	}

	/**
	 * @param dataSources
	 *            the dataSources to set
	 */
	public void setDataSources(Vector<DataSource> dataSources) {
		this.dataSources = dataSources;
	}

	public String toString() {
		String newline = System.getProperty("line.separator");
		StringBuffer buff = new StringBuffer();
		if (getDataSources() != null) {
			for (DataSource ds : getDataSources()) {
				buff.append(newline).append(ds);
			}
			return buff.toString();
		}
		return "";
	}
}


使用addObjectCreate方法,创建对象映射XML文件的属性对java Bean. 读取完一个对象将对象加入到一个集合中,然后再读取XML文件的下一个标签:
private void digester() {
	Digester digester = new Digester();

	setDataSources(new Vector<DataSource>());
	// 把当前对象压入到digester栈中。
	digester.push(this);
	
	// 指明匹配模式和要创建的类
	digester.addObjectCreate("datasources/datasource", DataSource.class);
	// 设置对象属性,与xml文件对应,不设置则是默认.
	digester.addBeanPropertySetter("datasources/datasource/name", "name");
	digester.addBeanPropertySetter("datasources/datasource/driver", "driver");
	digester.addBeanPropertySetter("datasources/datasource/url");
	digester.addBeanPropertySetter("datasources/datasource/username");
	digester.addBeanPropertySetter("datasources/datasource/password");
	
	// 当移动到下一个标签中时的动作
	digester.addSetNext("datasources/datasource", "addDataSource");
	
	try {
		digester.parse("datasource.xml");
	} catch (IOException e) {
		e.printStackTrace();
	} catch (SAXException e) {
		e.printStackTrace();
	}
}

public void addDataSource(final DataSource ds) {
	getDataSources().add(ds);
}


使用addRule方法来解析datasource.xml:
private void digester() {
	Digester digester = new Digester();

	setDataSources(new Vector<DataSource>());
	// 把当前对象压入到digester栈中。
	digester.push(this);

	Rule objectCreate = new ObjectCreateRule(DataSource.class);
	digester.addRule("datasources/datasource", objectCreate);

	digester.addRule("datasources/datasource", new SetNextRule(
			"addDataSource"));

	digester.addRule("datasources/datasource/name", new CallMethodRule(
			"setName", 0, new Class[] { String.class }));
	digester.addRule("datasources/datasource/driver", new CallMethodRule(
			"setDriver", 0, new Class[] { String.class }));
	digester.addRule("datasources/datasource/url", new CallMethodRule(
			"setUrl", 0, new Class[] { String.class }));
	digester.addRule("datasources/datasource/username", new CallMethodRule(
			"setUsername", 0, new Class[] { String.class }));
	digester.addRule("datasources/datasource/password", new CallMethodRule(
			"setPassword", 0, new Class[] { String.class }));
	try {
		digester.parse("datasource.xml");
	} catch (IOException e) {
		e.printStackTrace();
	} catch (SAXException e) {
		e.printStackTrace();
	}
}


打印出来的结果应该是:
INFO: 
DataSource : name : mysqldatasource Driver : com.jdbc.mysql.Driver URL : jdbc:mysql://localhost:3306/test Username : root Password : 1234
DataSource : name : oracledatasource Driver : oracle.jdbc.driver.oracledriver URL : jdbc:oracle:thin:@localhost:1521:orcl Username : scott Password : tiger
分享到:
评论

相关推荐

    java反射,Digester解析xml文档

    java反射,Digester解析xml文档

    使用Digester解析XML文档示例

    使用Digester解析XML文档示例

    digester解析XML文件实例

    这是一个JAVA工程,导入后可直接运行,主要演示如何用digester解析XML文件

    使用Apache的Digester来解析XML文档

    使用Apache的Digester来解析XML文档,代码,有解析!

    Digester解析XML问题.pdf

    Digester解析XML问题.pdf

    Digester解析XML的小例子(对象嵌套)

    使用STRUTS的解析XML技术digester来解析多层嵌套的XML文件,简单易懂

    使用digester配置rule.xml规则来解析自定义的xml文件-代码

    使用digester配置rule.xml规则来解析自定义的xml文件

    Digester 实例

    首先Digester是什么,它是用来解析xml文件的的工具,是jakarta开源项目下commons的一个子项目,它能让程序员更方便的解析xml文件,而不需要了解底层的工作细节。 Digester 解析xml文件 实例。

    扩展PlugIn插件解析XML

    接口利用Digester类解析Xml文件为对象 个人感觉简单易懂,如有问题,还请多多指教。

    Digester_object

    测试利用Digester解析xml文件的java代码源码文件,包括:server.java、service.java、Engine.java、Listener.java和DigesterServer.java。

    digester jar 包

    java 解析xml文件 digester 将xml转换为java数据 digester jar 包

    digester解析实例

    实现XML解析好方法,使用digester效果比DOM,SAX解析更有效。当然对于小文件尽量不用digester.

    Jakarta-Common-Digester使用笔记

    我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出...

    Digester笔记

    首先Digester是什么,它是用来解析xml文件的的工具,是jakarta开源项目下commons的一个子项目,它能让程序员更方便的解析xml文件,而不需要了解底层的工作细节。 如果要使用Digester作为xml文件的解析,请到jakarta...

    digester

    digester解析xml的全套组件,分别为digester-1.8, collections-3.2, beanutils-1.7.0, logging- &lt;br&gt;1.1.1。4个包里的jar文件已放在了一起,方便使用者导入,使用者亦可通过前缀区别组件。另外,jar &lt;br&gt;和...

    用到digester项目,直接解析存入数据库

    解析使用的xml文件在"参与者基础数据-4月.zip",sql语句就不贴了,如果是测试digester只需将dao层改一下,不要连接数据库,不同数据库创表好麻烦,如果需要存入数据库可以自行创建。

    JOX实现XML和JavaBean相互转化

    XML和JavaBean相互转化是一个非常有用的工作,用来读写xml的组件很多,比如dom4j, sax, JDom,Digester等,但是很多组件用起来很麻烦,今天给大家推荐一个超级简单的组件JOX, JOX是一套用户XML document和Java ...

    dom4j解析天气预报

    实现XML解析好方法,使用dom4j效果比DOM,SAX解析更有效。当然对于小文件尽量不用digester.

    开发自己一套struts框架

    此项目是为了更深入的理解MVC模式以及Struts的工作流程而开发的,运用了第三方commons组件, commons-digester来解析xml文件,把配置信息全部封装成类,然后运用MVC的思想去做相应的操作.

Global site tag (gtag.js) - Google Analytics