Catalina使用Digester解析XML配置文件,所以这里讲解一下如何使用Digester读取配置文件。
Digester是一款用于将XML转换为java对象的事件驱动型工具,是对SAX的高层次封装,隐藏了XML节点具体的层次细节,使开发者更加专注于处理过程。Digester最早作为struts的一部分,后来移到了Apache Commons项目中,maven依赖如下
<dependency> <groupId>commons-digester</groupId> <artifactId>commons-digester</artifactId> <version>2.0</version> </dependency> 示例代码如下:首先定义一个Java对象
package org.csu.coderlee.tomcat.digester; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by lixiang on 2017 07 11 下午12:52. */ public class Department { private String name; private String code; private Map<String, String> extension = new HashMap<String, String>(); private List<User> users = new ArrayList<User>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public void addUser(User user) { this.users.add(user); } public void putExtension(String name, String value) { this.extension.put(name, value); } } package org.csu.coderlee.tomcat.digester; /** * Created by lixiang on 2017 07 11 下午1:18. */ public class User { private String name; private String code; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }上述代码中,Department对象包含name和code两个属性,以及一个User的列表,一个表示扩展属性的Map
要转换的XML文件内容如下 test.xml
<?xml version="1.0" encoding="utf-8" ?> <department name="deptname001" code="deptcode001"> <user name="username001" code="usercode001"></user> <user name="username002" code="usercode002"></user> <extension> <property-name>director</property-name> <property-value>joke</property-value> </extension> </department>这样准备工作已经完成,我们可以来编写代码完成XML的解析
package org.csu.coderlee.tomcat.digester; import org.apache.commons.digester.Digester; import java.io.File; /** * Created by lixiang on 2017 07 11 下午1:01. */ public class DigesterHandler { public static void main(String[] args) { Digester digester = new Digester(); digester.setValidating(false); // digester.setRules(true); //匹配department节点时, 创建Department对象 digester.addObjectCreate("department", Department.class); digester.addSetProperties("department"); digester.addObjectCreate("department/user", User.class); digester.addSetProperties("department/user"); digester.addSetNext("department/user", "addUser"); digester.addCallMethod("department/extension", "putExtension", 2); digester.addCallParam("department/extension/property-name", 0); digester.addCallParam("department/extension/property-value", 1); try { Department department = (Department) digester.parse(new File("/Users/lixiang/workspace/javase/src/main/java/org/csu/coderlee/tomcat/digester/test.xml")); System.out.println(department); } catch (Exception e) { e.printStackTrace(); } } }