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));

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值