首先要搞清楚,digester是按栈(先进后出)的方式去解析rule的,即【先执行的代码后生效】

废话不多说,看实例的结构:

解析rule需要将xml文件和java对象关联起来,所有先创建两个java对象:

//学校
public class School {String name;String address;//一座学校包含多个老师List<Teacher> teachers = new ArrayList<Teacher>();//添加老师public void addTeacher(Teacher teacher){teachers.add(teacher);}//打印public String toString(){System.out.print("School:["+"name="+this.name+",naddress="+this.address);for(int i=0;i<this.teachers.size();i++){System.out.print(",teacher"+i+"="+this.teachers.get(i).getName());}System.out.println("]");return null;}//自行添加属性对应的get和set方法
}
//老师
public class Teacher {long code;String name;int age;String sex;//打印public String toString() {System.out.println("Teacher [code=" + this.getCode() + ", name=" + this.getName() + ", age=" + this.getAge()+ ", sex=" + this.getSex() + "]");return null;}//自行添加属性对应的get和set方法
}

接下来创建一个带有数据的xml文件,它就是我们要解析的文件:

<?xml version="1.0"?>
<school><name>华南理工大学广州学院</name><address>花都区</address><teacher name="李老师" age='22'><name>洋平化</name><code>1001001</code><sex>男</sex><age>50</age></teacher><teacher name="Liu老师" age="32"><name>洋平化</name><code>1001001</code><sex>男</sex><age>50</age></teacher>
</school>

最后,创建解析xml的rule文件,其实看英文标签都能理解其意思了,注意设置对象的属性有两种方法,第一种是通过<bean-property-setter-rule>读取<school>标签下的【子标签】,另一种是通过调用setXXX的方法读取<school>标签中的【属性】

<?xml version="1.0"?>
<!DOCTYPE digester-rules PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN" "http://jakarta.apache.org/commons/digester/dtds/digester-rules.dtd">
<digester-rules><!-- value是匹配的节点的名字 --><pattern value="school"><!-- 当匹配到school标签时,就创建一个digester.School对象 --><object-create-rule classname="digester.School" /><!-- 将<school>标签下的内容设置到digester.School对应的属性中 --><bean-property-setter-rule pattern="name"/><bean-property-setter-rule pattern="address"/><!-- 调用digester.School对象中的toString()方法 --><call-method-rule methodname="toString"/><!-- 匹配<teacher>标签 --><pattern value="teacher"><!-- 创建teacher对象 --><object-create-rule classname="digester.Teacher" /><!-- 回调digester.School对象中的addTeacher方法 --><set-next-rule methodname="addTeacher"/><!-- 调用digester.Teacher对象中的toString()方法 --><call-method-rule methodname="toString"/><!-- 调用方法并设置属性 --><call-method-rule methodname="setName" paramcount="1"/><call-param-rule paramnumber="0" attrname="name"/></pattern></pattern>
</digester-rules>

最后创建解析工具类,这里要先加入jar包(包括commons-logging-1.2.jar、commons-digester-2.1.jar、commons-beanutils-1.9.3.jar)

下载地址:https://download.csdn.net/download/kshon/11592478

public class DigesterTest {public void parse(){Digester dig = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("digester/school-rule.xml"));try {School s = (School) dig.parse(this.getClass().getClassLoader().getResourceAsStream("digester/school.xml"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {// TODO Auto-generated method stubnew  DigesterTest().parse();}}

输出结果为:

1、在这里有一个坑,那就是前面说的先进后出,例如你在rule.xml文件中把设置属性的方法移到前面,那么它就会最后执行,这样就导致调用其它方法的时候读不出属性值,但是【回调方法】不管放在哪个位置都是最后执行

结果为:

digester解析rule详解相关推荐

  1. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  2. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  3. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  4. Android init.rc文件解析过程详解(一)

        Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...

  5. 加载vue文件步骤_vue中.vue文件解析步骤详解

    这次给大家带来vue中.vue文件解析步骤详解,vue中.vue文件解析的注意事项有哪些,下面就是实战案例,一起来看一下. 我们平时写的 .vue 文件称为 SFC(Single File Compo ...

  6. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  7. 阿里云物联网平台-数据解析脚本详解

    阿里云物联网平台-数据解析脚本详解 var COMMAND_REPORT = 0x00; //属性上报. var COMMAND_SET = 0x01; //属性设置. var COMMAND_REP ...

  8. linux中etc下的hosts(本地IP解析)文件详解

    linux中etc下的hosts(本地IP解析)文件详解 1./etc/hosts(本地解析) 很多人一提到更改hostname首先就想到修改/etc/hosts文件, 认为hostname的配置文件 ...

  9. python 元组拆包_Python元组拆包和具名元组解析实例详解

    前言 在Python中元组是一个相较于其他语言比较特别的一个内置序列类型.有些python入门教程把元组成为"不可变的列表",这种说法是不完备的,其并没有完整的概括元组的特点.除了 ...

  10. java中的json_JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

最新文章

  1. tomcat端口号被占用怎么解决_电脑C盘空间不够用怎么办?Win7解决C盘占用空间大的3个方法!...
  2. 天兔(Lepus)监控系统慢查询分析平台安装配置
  3. Redis入门到精通-Redis高级命令
  4. Unit Test测试框架中的测试的执行顺序
  5. 【 C 】assert.h 简明介绍
  6. Halcon模板匹配之读取dxf文件生成xld与后续操作
  7. [脑海成像]科学家利用动态电极绕过眼睛直接刺激大脑,在盲人脑海画出字母
  8. SESSION存储于redis(CI3)
  9. golang 请求带验证信息的坑
  10. websocket学习笔记
  11. JFinal 1.5 发布,JAVA极速WEB+ORM框架
  12. matplotlib绘制箭头
  13. SCOvs. IBM 最新判决出炉,SCO再败
  14. Spark 集群安装
  15. Java学习资料--网盘分享
  16. autocad字体ccfang,求CAD字体hzmsdi.shx 发到我邮箱,185955330@qq.com
  17. iframe背景色透明
  18. ASR中常用的语音特征之FBank和MFCC
  19. 轻松易懂的CSS学习权威指南来了
  20. QNX Screen---Blit

热门文章

  1. 三菱plc pwm指令_【三菱PLC指令教程】步进指令STL和RET(单序列状态转移图编程)
  2. JQ树形菜单加表格混合使用:treeTable组件使用
  3. zcu106 固化_ZCU106的PYNQ移植
  4. SSH 命令的11种用法
  5. Windows下使用SSH命令登录Linux服务器
  6. Android之阿里云推送实现
  7. CSS实现div垂直居中 div上下居中显示
  8. 大师级游戏建模教程:使用Maya和XGen进行角色制作
  9. 请问ECSHOP首页站内快讯在哪里添加和修改?
  10. 记Dorado7学习(3)