转自:

Apache commons digester简介说明

下文笔者讲述Apache commons digester组件的简介说明,如下所示

Apache commons digester组件简介说明

 digester组件简化xml文件处理操作能将xml文件预先定义的规则(采用编码形式或xml配置文件形式)映射成java对象digester组件现在最新版本是2.0它所依赖的组件是:commons-logging(推荐1.1版本),BeanUtils(推荐1.8版本)还有需要jdk1.5

Apache commons digester组件解析原理

 在Digester中采用SAX来解析XML文件解析xml文件时,它使用Stack来保存和检索这个期间产生的对象

例:

<?xml version="1.0"?>
<students><student><name>maomao</name><course>java</course></student><student><name>chengcheng</name><course>python</course></student>
</students>每个标签与相应的匹配模式对应如下表:
标签              匹配模式
<students> students
<student>  students/student
<name>     students/student/name
<course>   students/student/course

使用匹配模式可以很方便的定位需要处理的元素
为了处理这些元素,需要定义处理规则
规则在匹配模式被找到时起作用
所有的规则都是从org.apache.commons.digester.Rule派生的
所有已定义的Rule对,都在org.apache.commons.digester中

常用的规则:
- ObjectCreate,创建对象实例。
- SetProperties,将标签属性(Attribute)与要创建的对象的属性相关联。
- BeanPropertySetter,将标签所包含标签与要创建的对象的属性相关联。
- SetNext,设置遇到下一个标签时的动作。
- CallMethod,设置当匹配模式被找到时要调用的方法。
- CallParam,设置对应的callMethod中指定方法所需要的参数值。

1.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<students><student><name>maomao</name><course>Java</course></student><student><name>chengcheng</name><course>python</course></student>
</students>2.硬编码形式实现
Student类
package com.java265;
public class Student {private String name;private String course;public void setName(String name){this.name=name;}public void setCourse(String course){this.course=course;}public String getName(){return this.name;}public String getCourse(){return this.course;}
}处理类
package com.java265;
import org.apache.commons.digester.*;
import org.apache.commons.logging.*;
import java.io.IOException;
import java.util.Vector;
import org.apache.commons.digester.xmlrules.*;
import org.xml.sax.SAXException;
public class DigestTest {  private Log log=LogFactory.getLog(this.getClass());  private Vector students;  public DigestTest(){  students= new Vector(5);  }  public void addStudent( Student student){  students.add( student);  }  public String toString(){  return ((Student)students.get(0)).getName();  }  public void digest(){  //digest2.0支持jdk1.5,并且依赖 logging 1.1.1 和 beanutils 1.8.0  //创建实例  Digester digester= new Digester();  //将初始对象压入digester的stack  digester.push( this);  //指明匹配模式和要创建的类  digester.addObjectCreate( "students/student", Student.class);  //设置对象属性  // digester  digester.addBeanPropertySetter( "students/student/name");  digester.addBeanPropertySetter( "students/student/course");  //当移动到下一个标签中时的动作  digester.addSetNext( "students/student", "addStudent");  try {  //解析,xml文件放在classpath下  DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml"));    log.info(ds);  } catch (Exception e) {  e.printStackTrace();  }  }  public static void main(String args[]){  DigestTest test=new DigestTest();  test.digest();  }
}

配置文件方式实现

配置文件
studentsRule.xml

<?xml version="1.0"?>
<digester-rules><pattern value="students"><object-create-rule classname="com.java265.Students" /><set-properties-rule /><pattern value="student"><object-create-rule classname="com.java265.Student" /><bean-property-setter-rule pattern="name"/><bean-property-setter-rule pattern="course"/><set-next-rule methodname="addStudent" /></pattern></pattern>
</digester-rules>Student类
package com.java265;
public class Student {private String name;private String course;public void setName(String name){this.name=name;}public void setCourse(String course){this.course=course;}public String getName(){return this.name;}public String getCourse(){return this.course;}
}Students类
package com.java265;
import java.util.Vector;
public class Students {private Vector students;public Students(){students= new Vector(5);}public void addStudent( Student student){students.add( student);}public String toString(){return ((Student)students.get(0)).getName();}
}处理类
package com.java265;
import org.apache.commons.digester.*;
import org.apache.commons.logging.*;
import java.io.IOException;
import java.util.Vector;
import org.apache.commons.digester.xmlrules.*;
import org.xml.sax.SAXException;
public class DigestTest {  private Log log=LogFactory.getLog(this.getClass());  public void digestByConfig(){  Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml"));  try {  Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml"));  System.out.println(a);  log.info(a);  } catch (IOException e) {  e.printStackTrace();  } catch (SAXException e) {  e.printStackTrace();  }  }  public static void main(String args[]){  DigestTest test=new DigestTest();  test.digestByConfig();  }
}

使用Digester需要注意的地方

1:调用顺序,正确的调用顺序才能得出正确的结果方法调用顺序基本和标签在xml文件中的层次关系相对应基本的顺序是:先创建对象;然后设置属性;随后处理子元素;最后设置遇到下一个元素所对应的动作对于子元素的处理,是同样的过程。
2:正确的使用初始对象
3:digester的addSetNex方法中所指定的方法实际上是包含匹配模式对应标签的父标签对应对象的方法在上两个例子中addStudent,都是包含Student对象的那个对象的方法对于第一个例子,是DigesterTest;对于第二个例子,是Students。而且它的位置通常是在创建对象语句组的最后,与addObjectCreate相对应。在这2个语句之间的代码中所指定的方法都是所创建对象的方法。而且它们的顺序与匹配模式所对应的标签的顺序必须是一致的。
4:使用配置文件来创建digester,这样会带来很大的灵活性

Apache commons digester简介说明相关推荐

  1. JBOSS java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet

    经常在启动JBOSS的时候,发现在myeclipse的console中报错java.lang.NoClassDefFoundError: org/apache/commons/digester/Rul ...

  2. Apache Commons Daemon简介说明

    转自: Apache Commons Daemon简介说明 下文笔者讲述Apache Commons Daemon的功能简介说明,如下所示 Apache Commons Daemon的功能 用于将一个 ...

  3. Apache Commons 系列简介 之 CLI

    原文链接:http://www.blogways.net/blog/2014/01/15/apache-commons-cli.html Apache Commons的主要目的就是,创建和维护一个可重 ...

  4. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  5. 使用 Apache Commons CLI 开发命令行工具

    http://www.ibm.com/developerworks/cn/java/j-lo-commonscli/index.html 使用 Apache Commons CLI 开发命令行工具 杨 ...

  6. Java命令行界面(第1部分):Apache Commons CLI

    尽管我通常使用Groovy编写要从命令行运行的JVM托管脚本,但是有时候我需要解析Java应用程序中的命令行参数,并且有很多库可供Java开发人员用来解析命令行参数. 在本文中,我将介绍这些Java命 ...

  7. IO与文件读写---使用Apache commons io包提高读写效率

    [一]Apache commons IO简介 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解: Commons IO is a library of u ...

  8. JavaMail| Apache Commons Email介绍

    Apache Commons Email简介 Apache Commons Email旨在提供一个用于发送电子邮件的API.它建立在JavaMail API之上,旨在简化它. 官网: http://c ...

  9. 使用 Apache Commons CLI 解析命令行参数示例

    很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...

  10. java Apache Commons jar包简介

    一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI 说明 ...

最新文章

  1. 学python需要什么基础知识-Python的学习,都需要具备哪些计算机基础知识?
  2. Spring静态资源访问配置
  3. 对测试人员或开发人员来说相互沟通有多重要?
  4. 论文浅尝 | 机器阅读理解中常识知识的显式利用
  5. 元胞计算机系统,元胞自动机
  6. 16.1 Class类与Java反射
  7. PaddlePaddle Transformer encoder 源码解析 v1.7
  8. 3个步骤+1个模型,原来「数据分析」才是「增长黑客」的核心技能!
  9. 用计算机弹歌曲fade,抖音短视频踢脚舞是什么歌 Faded歌曲分享
  10. Enhancement
  11. java文件转二进制
  12. 大数据下的密码学技术挑战
  13. Win10 提示WerFault.exe 应用程序错误解决方法(非常规方法)
  14. 给App启用MultiDex功能
  15. 论金融IT公司程序员的职业发展
  16. final关键字、权限、内部类
  17. Unity 3D 创建 合适角度 圆环 内 五边形柱体 mesh
  18. html5+语音留言,5元/月!中国联通上线“语音留言”业务
  19. 计算机画图怎样更改文字,如何使用最简单的画图工具修改图片或者文字
  20. JavaScript初见

热门文章

  1. 雷云3 Razer Synapse官方版-雷云3 Razer Synapse官方版下载
  2. 进制转换方法总结——摘自百度
  3. 二进制、十进制、八进制、十六进制转换方法
  4. Java代码如何翻译成机器语言
  5. 针对华为荣耀6移动高配版(H60-L11)的root工作
  6. 【Dam Dadi Doo】MMD镜头+动作打包下载.zip
  7. 偶极子天线参数优化记录
  8. 考研高等数学张宇30讲笔记——第十二讲 二重积分
  9. mac电脑投屏到小米盒子_电脑投屏到小米盒子
  10. 2022年北京航空航天大学计算机考研复试时间与复试内容