项目遇到的digester的问题

今天在用digester解析xml的时候,碰到一个问题,一段很简单的xml文档,需要通过digester包装成一个javabean

<?xml version="1.0" encoding="utf-8" ?>
<StockInfo>
<StockCode>00001</StockCode>
<StockName>长江实业</StockName>
<CurPrice>72.800</CurPrice>
....
</StockInfo>


项目中已经有digester的解析的抽象类,只需要重写一个规则的方法,传入需要返回的javaBean的类

AnalyseXml<HKStock> xml=new AnalyseXml<HKStock>(con.getInputStream()){
public void rule(Digester dig){
dig.addObjectCreate("StockInfo",HKStock.class);
dig.addCallMethod("StockInfo/StockCode","setStockCode",0);
dig.addCallMethod("StockInfo/StockName","setStockName",0);
dig.addCallMethod("StockInfo/CurPrice","setCurPrice",0);
.........
}
};


运行之后,返回的javaBean类中的属性没有值。而后进入AnalyseXml类中解析xml的那段代码中查看,发现有这样一行dig.push(ct)

T ct;
ct = (T)getDomainClass().newInstance();
dig.push(ct);
rule(dig);
dig.parse(this.input);
return ct;


这里想到了,当需要把xml文档解析成一个树形对象结构时侯,digester提供有clear(),
peek(),pop(),push()这些方法,而digester的push方法将一个新的对象压入栈顶,将栈顶的对象做为一个参数,传递给第二栈顶的一个方法,就可以简单地建立 起一种“父子关系”。而我需要的只是简单的javaBean,分析的是digester在解析xml时,首先把第一个HKStock对象通过push方法压入栈顶,这个对象注意是没有set任何值进去,在进行自定义的规则解析,碰到<StockInfo>开始标签,创建一个HKStock对象,接着把<StockInfo>下的子节点对应到HKStock的属性,一直到</StockInfo>结束。这个解析过程创建了一个有值的HKStock对象,并把它压入栈中,但它并没有和栈顶的对象建立起父子关系,当最后parse()方法时,digester返回的是栈底对象,也就是那个没有set任何值的对象,原因就出在这里。

然后着手准备修改

AnalyseXml<ArrayList> xml=new AnalyseXml<ArrayList>(con.getInputStream()){
public void rule(Digester dig){
dig.addObjectCreate("StockInfo",HKStock.class);
//和ArrayList建立父子关系
dig.addSetNext("StockInfo","add");
dig.addCallMethod("StockInfo/StockCode","setStockCode",0);
dig.addCallMethod("StockInfo/StockName","setStockName",0);
dig.addCallMethod("StockInfo/CurPrice","setCurPrice",0);
.........
}
};


运行之后返回的是有值的javaBean.还有种方法是把push给干掉,这样可以直接得到,但是需要形成复杂的对象树形结构时,还是需要把push加上,当然digester构建对象树形结构也不只这一种方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值