Digester简介和使用

一、Digester简介       

           1、sax简单介绍,对于XML的解析java有很多种实现,如DOM、SAX等,degister就是基于SAX实现,SAX提供了文件读取的底层接口,它是基于事件驱动类型。在解析XML的过程中,元素通过匹配模式(matching pattern)进行识别,比如当扫描到文节点元素(element)开始或者结束这些地方的时候会通知事件处理函数(Handler),由事件处理函数作出相应的处理,直到文档处理结束。
           2、DefaultHandler,上面说过在解析XML过程中匹配到相应的格式就会触发对应Handler中对应的函数,我们看下DefaultHandler中几个最主要的方法:

//在读到文档开始时调用
void startDocument()

//在读到文档结束时调用
void endDocument()

// 读到开始标签时调用
void startElement(String uri, String localName, String qName, Attributes attributes) 

//读到结束标签时调用
void endElement(String uri, String localName, String qName) 

// 读到文本内容时调用
void characters(char[] ch, int start, int length) 

 

我们在使用SAX做XML解析的时候就只需要在重写这几个方法实现对应的逻辑即可。但是这样没有通用性,新增一个XML就可能需要重新定义一个Handler,太麻烦!这个时候Digester就出山了。
         3、digester,对于XML文档中每个元素,Digester对象都会检查它是否需要做预定义事件,所以我们在parse前定义好Digester对象需要执行哪些动作即可。那么这些动作该如何定义?
其实很简单,定义好模式(XML的结构),每一个模式与一个或者多个规则相关联。下面我们看一个简单的XML:

<?xml version="1.0" encoding="UTF-8"?>
<server port="8005" shutdown="SHURDOWN">
    <service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    </service>
</server>

这个XML应该不陌生把,这个XMl根元素是server。
                a、模式:根元素的模式和根元素的名称相同,子元素的模式是父元素的模式+“/”+该子元素的名字拼接而成。service元素是sever的子元素,service的元素模式就是server/service,说白了就是一个类似于yml结构化东西。元素模式已经定义好了,下面就剩下规则了。
                b、规则:digeser库预定义了很多规则,比如创建对象(addObjectCreate)和设置属性(addSetProperties)、addSetNext等。rule中有begin和end方法,比如当digeser库在读取到某个模式的元素的开始标签时,如果此模式绑定了规则,那么就会执行rule的begin方法。下面看下具体的使用。

          
   二、digester简单使用


     先定义2个javabean(Sever和Service):

public class Server {
    private String name;
    private String  port;
    private String shutdown;

    private List<Service> serviceList = new ArrayList<>();

    public void addService(Service service){
        System.out.println("Server addService");
        serviceList.add(service);
    }

    public void  play(){
        System.out.println("i like pepsi");
    }
}

public class Service {
    private String  name;
}


     建立绑定关系:

 public void parseXml() throws IOException, SAXException {
        Digester digester = new Digester();
        //把当前对象置入栈顶
        digester.push(this);

        //开始设置 Server节点 我是栈顶拉
        digester.addObjectCreate("Server", Server.class);
        digester.addSetProperties("Server");
        digester.addCallMethod("Server","play");
        digester.addSetNext("Server","setServer");

        //同理 读取Service节点,现在我是栈顶
        digester.addObjectCreate("Server/Service", Service.class);
        digester.addSetProperties("Server/Service");
        // 调用addService方法 将Service加入Server对象
        digester.addSetNext("Server/Service", "addService");

        File file = new File("/Users/*****/server.xml");
        
        digester.parse(file);
    }

     一个简单的XML就解析成对象了,下面我们重点看下这里面的几个规则:
                d、digester预定义规则:
                       1、创建对象: 当需要digester对象在遇到某个模式的时候创建一个对象,调用addObjectCreate方法即可,这个方法主要的2个参数是:模式和class(类名)。比如我们在匹配到Server的时候想要创建一个Server对象使用addObjectCreate方法即可。
在Degister中维护了一个ArrayStack 栈(protected ArrayStack<Object> stack = new ArrayStack<>()),addObjectCreate创建的对象都会被压入这个栈内(类似于方法栈),可以用于对象之间关系的维护。

                       2、设置属性:刚才对象已经实例化了,但是属性没有被设值,addSetProperties方法可以为digester对象创建的对象设置属性值。只需要传入一个模式即可。
                       3、方法调用: addCallMethod方法只需模式和执行的方法名,digester对象匹配到这个规则绑定的模式后,会从digester对象维护的stack栈中取出栈顶的对象,并执行传入的方法。
                       4、创建对象之间关系:刚上面说到,digester对象内部维护了一个stack栈。上面Server对象内部有一个Service对象,这2个对象一前一后通过addObjectCreate压入,Service在栈顶,它们是通过addSetNext让Service和Server建立关系。
补充:digester对象内部维护了不止一个栈,总共维护了好像3个stack,用于将节点转成的对象的而准备的。分别是对象栈、rule栈(用于对象的操作规则)、param栈(XML节点的值),有兴趣的可以去看下tomcat中对于digester的使用。
到这里digester已经将XML解析成我们想要的对象。这里留个记录方便后续使用,有错误求指正!

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用\[1\]:错误原因:缺少依赖包:commons-digester.jar包。解决办法:向maven包管理器下的pom.xml文件中添加依赖: <!-- https://mvnrepository.com/artifact/commons-digester/commons-digester --> <dependency> <groupId>commons-digester</groupId> <artifactId>commons-digester</artifactId> <version>1.8</version> </dependency>。\[1\] 引用\[3\]:Apache commons digester组件简介说明,digester组件简化xml文件处理操作,能将xml文件预先定义的规则(采用编码形式或xml配置文件形式)映射成java对象。\[3\] 根据提供的引用内容,org/apache/commons/digester3/digester是指Apache commons digester组件的类路径。如果你遇到了这个错误,可能是因为缺少了commons-digester.jar包。你可以通过向maven的pom.xml文件中添加上述的依赖来解决这个问题。\[1\] Apache commons digester组件是一个用于简化处理XML文件的工具,它可以根据预先定义的规则将XML文件映射成Java对象。\[3\] #### 引用[.reference_title] - *1* [java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet 错误原因是缺少j相应jar包](https://blog.csdn.net/Sunshine_Dawn/article/details/80436180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Apache commons digester简介说明](https://blog.csdn.net/qq_25073223/article/details/127439162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值