项目遇到的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构建对象树形结构也不只这一种方法。

你可能感兴趣的:(xml)