网上看了两个Digester的Demo博客,使用时都出现了或大或小的错误,甚至编译都不通过,鉴于此,在此写一篇Digester的使用正确案例
本文章不讲解Digester的概念,只基于代码给出完整的使用说明
maven依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-digester3</artifactId>
<version>3.2</version>
</dependency>
需要解析的XML内容:
文件名为web-test.xml 放在项目的src同级目录下(注意不是src里面),也可以使用绝对路径
<?xml version="1.0" encoding="UTF-8"?>
<server port="8005" shutdown="SHURDOWN">
<service name="Catalina">
</service>
</server>
根据XML元素需要的实体类:
@Data //注意,要有getter/setter才可以注入属性值.如果没有Lombok,那么删除@Data注解手动生成既可
public class Server {
public String name;
public String port;
public String shutdown;
private List<Service> serviceList = new ArrayList<>();
public void addService(Service service){
serviceList.add(service);
}
public void printPort(){
System.out.println("my port is "+port);
}
@Data
public static class Service {
public String name;
}
@Override
public String toString() {
return "Server{" +
"name='" + name + '\'' +
", port='" + port + '\'' +
", shutdown='" + shutdown + '\'' +
", serviceList=" + serviceList+
'}';
}
}
测试代码类:
package testclass.testdigester;
import lombok.Data;
import org.apache.commons.digester3.Digester;
import org.junit.Test;
import java.io.File;
/**
* Created by chenguihao on 2019/12/18
*/
@Data
public class TestDigester {
public Server server;
@Test
public void test01() throws Exception{
Digester digester = new Digester();
//把当前对象置入栈顶
digester.push(this); //为的是在后面创建的Service对象保存在当前类中
//添加对象创建,条件:当遇到模式为server(即标签名为server)的元素时,创建Server这个类,注意需要为无参构造器
digester.addObjectCreate("server", Server.class);
//设置节点的属性设置规则。当解析遇到符合rule的节点时,根据属性列表中的属性值对,使用Java反射机制使用标准的JavaBean方法设置栈顶对象实例;
//(通俗点讲就是遇到server元素时,配置了addSetProperties的话,那么这个元素上的标签名和值将被设置到该元素bean对象的属性名和属性值.自动映射)
digester.addSetProperties("server");
//调用对象的methodName方法,paraNumber参数是表示方法需要的参数个数,当paraNumber=0时,可以单独使用,不然需要配合addCallParam方法
digester.addCallMethod("server","printPort");
//setServer是当前TestDigester对象的方法,将server对象设置到当前对象中
digester.addSetNext("server","setServer");
//下面跟上面是一样的,只不过多了一个斜杆/说明该service的pattern(匹配规则)是在server里面.以此类推.
digester.addObjectCreate("server/service", Server.Service.class);
digester.addSetProperties("server/service");
// 调用addService方法 将Service加入Server对象
digester.addSetNext("server/service", "addService");
File file = new File("web-test.xml"); //放在项目的src同级目录下(注意不是src里面),也可以使用绝对路径
digester.parse(file);
System.out.println(this.server);
}
public static void main(String[] args) throws Exception {
TestDigester testDigester = new TestDigester();
testDigester.test01();
}
}
运行main结果: