digester解析XML的基本使用 完全讲解

网上看了两个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结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值