Digester学习笔记

工作最近很忙,这两天终于有时间学习了一下DigesterJ

1.  简介:

Digester主要是通过继承DefaultHandler类,覆盖startDocument, endDocument, startElement, endElement方法,实现基于事件的xml文件解析,并通过在Digester上注册Rule,以便遇到相应标记时执行相关操作。Digester的一个主要数据结构是对象堆栈,其中,栈顶元素是当前正在解析的标记对应的对象,栈底元素为xml文件根标记对应的对象,而父标记对应的对象是栈顶元素下面相邻元素,对象栈支持的操作主要有:

clear():清空对象栈

peek():返回栈顶元素引用

push():将对象压入堆栈

pop():弹出栈顶元素并返回引用

 

 

2.关于Digester中的.Rule类:

Rule类主要包含了两个属性,即与该Rule相关连的DigesternamespaceURI。该类简单说就是定义了当匹配到Pattern时执行什么操作,主要有以下几个方法:

//当匹配到XML元素开始标记时会执行该函数,该元素的属性以Attribute参数传入

public void begin(Attributes attributes) throws Exception//建议不再使用

 

//当遇到匹配的元素嵌套文本内容时调用

//text为嵌套的文本

public void body(String text) throws Exception//建议不再使用

 

//当匹配到XML元素结束标记时会执行该函数

public void end() throws Exception//建议不再使用

 

针对上述三个deprecated函数,建议分别使用下述三个函数

/*namespace参数,表示元素的namespaceURI,如果解析器not aware或元素没有namespace则为空字符串””

name参数:如果解析器aware,则传入local name,否则只是元素名称。*/

public void begin(String namespace, String name, Attributes attributes) throws Exception

 

/* namespacename参数同上面的begin函数种的namespacename参数  */

public void end(String namespace, String name) throws Exception

 

//parse函数调用完毕后执行该函数,由此给用户提供了释放解析过程中创建的和缓存的资源的机会。

public void finish() throws Exception

 

注意:

可以在同一个Pattern上注册多个Rule,此时对于Rule的方法的顺序是:

begin/body:先注册的Rule的这两个方法先执行;

end:后注册的Ruledend方法先执行,先注册的后执行;

注意这两点的不同。

 

 

2RulesBase类:

Rules接口的默认实现,可以用作具体Rules实现类的父类,主要用来管理注册到Digester上的所有Rule

该类支持两种匹配模式:一是精确匹配,二是通过通配符*的模糊匹配。该类主要记录所有注册的Rule,内部实现是通过一个list记录所有的Rule,同时以Map存储了PatternKey,以该pattern对应的Rule组成的list为值对象。

 

 

3.几个常用的Rule

3.1 ObjectCreateRule:Rule在碰到给定的起始标记时创建对象并入栈,碰到结束标记后该对象出栈;

3.2 SetPropertiesRule:碰到指定的起始标记时为栈顶对象设置属性;

3.3 SetNextRule:碰到指定的结束标记时,将栈顶元素添加到次栈顶元素(父元素)的集合成员变量中,因此一般为一个标记注册该Rule前先为该标记注册ObjectCreateRule

3.4 CallMethodRule:在碰到开始标记时将初始化参数数组,碰到结束标记时执行指定的函数;

3.5 CallParamRule:碰到起始标记时会根据标记属性获取其属性值以初始化CallMethodRule中定义的方法需要的参数;如果不指定属性名称则会从标记text获取;该Rule一般结合CallMethodRule一起使用,并且是先注册CallMethodRule,后注册该Rule

 

可以通过Digester源码及实例代码进行深入学习J

 

参考资料:

http://commons.apache.org/digester/commons-digester-1.8/docs/api/org/apache/commons/digester/package-summary.html

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值