Digester解析XMLファイル


読み込むXMLファイル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つの階層に分かれています.
ノードその下に2つのノードが含まれています
ノード.など、さまざまな情報ノードが含まれます.
私たちの操作目標はdatasourceの情報ノードの内容を抽出することです.
を1つのオブジェクトと見なし,の情報ノードの内容をオブジェクトの要素とする.
クラスデータソースを設定.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ファイルを解析し、クラスを新規作成します.java:
addCallMethodメソッドを用いる、XMLに対応するノードとこのCall methodのパラメータをマッピングすればよい、このcall methodは、読み取った1つのラベル内のすべての値をオブジェクトに格納し、1つのセットに格納する.

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