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