java digester_Digester
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相关推荐
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid
Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...
- 查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码
java开发必知必会之看源码,而看源码的第一步则是找到源码
- java基本类型转换,随记
java基本类型转换: double double 转 long double random = Math.round(Math.random()*10000); long l = new Doubl ...
最新文章
- [树形dp] Jzoj P5233 概率博弈
- java 二维数组位置_请完成下列Java程序:查找一个矩阵中的鞍点,对于一个二维数组中的鞍点,该点位置上的元素在该行上...
- lucene Field部分参数设置含义
- JQuery发起ajax请求,并在页面动态的添加元素
- vue中align_Vue的简单Treeview组件,没有额外的依赖——VueTeatree
- linux 查看系统信息命令
- VRRP实现AC双机备份原理详解与配置实例
- ABB机器人VGT文件_ABB机器人GSD文件
- oracle 优化GROUP BY
- android 动画入门(一)
- 论文笔记 A brief introduction to weakly supervised learning - 2017
- Android 图片自动放大/缩小循环执行
- TensorFlow笔记(6) 单神经元分类
- unison + inotify 实现文件实时双向同步部署步骤
- 产品经理-自然资源行业4大产品线整理
- Linux 下压缩包解压后目录的权限问题
- uniapp 图片上传与展示
- arm linux not syncing,Linux系统启动中途停止,提示Kernel panic - not syncing: Attempted to kill init!...
- android服务下载apk下载地址,android 从服务器上获取APK并下载安装
- Wordpress建站教程
热门文章
- 百度PaddleOCR及云平台OCR API详解及示例
- Linux(ubuntu)下安装anaconda(64位)并配置jupyter notebook远程访问
- eclipse opengl java_OpenGL 之 Eclipse 开发环境搭建 | 学步园
- 关于(++i)+(++i)+(++i)与(++i)+(i++)与(i++)+(++i)
- 破译“生命天书”20年
- 个人计算机中的cache,cache在计算机中的作用是什么?
- pywinauto 连接已经打开的程序 如:微信
- python opencv调节图片亮度与对比度
- mnist学习实例(2)
- Flask显示图片并设置图片的缓存时间