Digester是apache的一个xml解析工具。

最近研究struts1源码时候才发现这东西挺好用的,可以很轻松的把XML转化成java对象。

上代码public class Acptrule {

private String id;

private List rules=new ArrayList();

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public List getRules() {

return rules;

}

public void setRules(List rules) {

this.rules = rules;

}

public void addRule(Rule r){

rules.add(r);

}

public String toString(){

return "Acptrule:[id="+id+",\nrules:"+rules+"\n]";

}

}

public class Rule {

private String type;

private List rounds=new ArrayList();

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public List getRounds() {

return rounds;

}

public void setRounds(List rounds) {

this.rounds = rounds;

}

public void addRound(Round r){

rounds.add(r);

}

public String toString(){

return "Rule:[type="+type+",\nrounds:"+rounds+"\n]";

}

}

public class Round {

private String val;

private String allowed;

private List notes=new ArrayList();

public String getVal() {

return val;

}

public void setVal(String val) {

this.val = val;

}

public String getAllowed() {

return allowed;

}

public void setAllowed(String allowed) {

this.allowed = allowed;

}

public List getNotes() {

return notes;

}

public void setNotes(List notes) {

this.notes = notes;

}

public void addNoteinfo(Noteinfo i){

notes.add(i);

}

public String toString(){

return "Round:[val="+val+",allowed="+allowed+",\nnotes:"+notes+"\n]";

}

}

public class Noteinfo {

private String notetype;

private String dcflag;

public String getNotetype() {

return notetype;

}

public void setNotetype(String notetype) {

this.notetype = notetype;

}

public String getDcflag() {

return dcflag;

}

public void setDcflag(String dcflag) {

this.dcflag = dcflag;

}

public String toString(){

return "Noteinfo:[notetype="+notetype+",dcflag="+dcflag+"]";

}

}

以上是定义的几个java类。

下面是XML文件<?xml  version='1.0' encoding='gb18030'?>

解析代码public static void main(String[] args) throws SQLException, IOException,

SAXException {

//读文件

URL url=Test.class.getClassLoader().getResource("20000.xml");

BufferedReader br = new BufferedReader(new FileReader(url.getPath()));

String line=null;

StringBuffer xml=new StringBuffer();

while((line=br.readLine())!=null){

xml.append(line);

}

//getRuleFromXML解析方法

Acptrule r = (Acptrule) getRuleFromXML(xml.toString());

System.out.println(r);

br.close();

}

//Digester解析

public static Acptrule getRuleFromXML(String xml) throws IOException,

SAXException {

Digester d = new Digester();

//不校验

d.setValidating(false);

//主要是通过RuleSet来做解析,网上大部分资料都是调用Degister.addXXX方法来实现的

//RuleSet相当于一个Rule的集合。在addRuleInstances方法里,可以自己设计各种Rule,实际上效果和addXXX相当。好处就是把Rule和某个Digester分离

RuleSet rs = new RuleSet() {

@Override

public String getNamespaceURI() {

return null;

}

@Override

public void addRuleInstances(Digester d) {

//对象创建Rule

d.addRule("acptrule", new ObjectCreateRule(Acptrule.class));

d.addRule("acptrule/rule", new ObjectCreateRule(Rule.class));

d.addRule("acptrule/rule/round", new ObjectCreateRule(Round.class));

d.addRule("acptrule/rule/round/noteinfo", new ObjectCreateRule(

Noteinfo.class));

//当解析acptrule/rule完成后,调用xx方法的rule

d.addRule("acptrule/rule", new SetNextRule("addRule"));

d.addRule("acptrule/rule/round", new SetNextRule("addRound"));

d.addRule("acptrule/rule/round/noteinfo", new SetNextRule(

"addNoteinfo"));

//属性赋值rule(标签的attribute)

d.addRule("acptrule", new SetPropertiesRule("id", "id"));

d.addRule("acptrule/rule",new SetPropertiesRule("type", "type"));

d.addRule("acptrule/rule/round", new SetPropertiesRule("val",

"val"));

d.addRule("acptrule/rule/round", new SetPropertiesRule(

"allowed", "allowed"));

d.addRule("acptrule/rule/round/noteinfo",

new SetPropertiesRule("type", "notetype"));

d.addRule("acptrule/rule/round/noteinfo",

new SetPropertiesRule("dcflag", "dcflag"));

}

};

d.addRuleSet(rs);

return (Acptrule) d.parse(new StringReader(xml));

}

java digester_Digester相关推荐

  1. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  2. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  3. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  4. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  5. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  6. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  7. Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid

    Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...

  8. 查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码

    java开发必知必会之看源码,而看源码的第一步则是找到源码

  9. java基本类型转换,随记

    java基本类型转换: double double 转 long double random = Math.round(Math.random()*10000); long l = new Doubl ...

最新文章

  1. [树形dp] Jzoj P5233 概率博弈
  2. java 二维数组位置_请完成下列Java程序:查找一个矩阵中的鞍点,对于一个二维数组中的鞍点,该点位置上的元素在该行上...
  3. lucene Field部分参数设置含义
  4. JQuery发起ajax请求,并在页面动态的添加元素
  5. vue中align_Vue的简单Treeview组件,没有额外的依赖——VueTeatree
  6. linux 查看系统信息命令
  7. VRRP实现AC双机备份原理详解与配置实例
  8. ABB机器人VGT文件_ABB机器人GSD文件
  9. oracle 优化GROUP BY
  10. android 动画入门(一)
  11. 论文笔记 A brief introduction to weakly supervised learning - 2017
  12. Android 图片自动放大/缩小循环执行
  13. TensorFlow笔记(6) 单神经元分类
  14. unison + inotify 实现文件实时双向同步部署步骤
  15. 产品经理-自然资源行业4大产品线整理
  16. Linux 下压缩包解压后目录的权限问题
  17. uniapp 图片上传与展示
  18. arm linux not syncing,Linux系统启动中途停止,提示Kernel panic - not syncing: Attempted to kill init!...
  19. android服务下载apk下载地址,android 从服务器上获取APK并下载安装
  20. Wordpress建站教程

热门文章

  1. 百度PaddleOCR及云平台OCR API详解及示例
  2. Linux(ubuntu)下安装anaconda(64位)并配置jupyter notebook远程访问
  3. eclipse opengl java_OpenGL 之 Eclipse 开发环境搭建 | 学步园
  4. 关于(++i)+(++i)+(++i)与(++i)+(i++)与(i++)+(++i)
  5. 破译“生命天书”20年
  6. 个人计算机中的cache,cache在计算机中的作用是什么?
  7. pywinauto 连接已经打开的程序 如:微信
  8. python opencv调节图片亮度与对比度
  9. mnist学习实例(2)
  10. Flask显示图片并设置图片的缓存时间