利用digester来将xml转换为bean

利用digester来将xml转换为bean

org.apache.commons. digester这个包提供了一个工具,可以很迅速的将一个xml文件转换为一个bean。
下面的这个例子,包括有2个bean文件,一个xml文件,一个java主处理文件。
2个bean的代码如下:
Java代码 复制代码
  1. package test.digester;   
  2. import java.util.ArrayList;   
  3. import java.util.List;   
  4.   
  5. public class Foo {   
  6.     private List<Bar> bars;   
  7.     private String name;   
  8.        
  9.     public void addBar(Bar bar){   
  10.         if (bars==null){   
  11.              bars = new ArrayList<Bar>();   
  12.          }   
  13.          bars.add(bar);   
  14.      }   
  15.        
  16.     public List getBars() {   
  17.         return bars;   
  18.      }   
  19.        
  20.     public String getName() {   
  21.         return name;   
  22.      }   
  23.     public void setName(String name) {   
  24.         this.name = name;   
  25.      }   
  26.        
  27.     public String toString(){   
  28.          String str = "";   
  29.          str = "name=" + getName() + ";";   
  30.          List list = getBars();   
  31.         if (list==null){   
  32.             return str;   
  33.          }   
  34.         int len = list.size();   
  35.          String bar = "";   
  36.         for(int i=0;i<len;i++){   
  37.              Bar b = (Bar)getBars().get(i);   
  38.              bar = bar + "{"+b.toString()+"},";   
  39.          }   
  40.         if (bar.length()>0){   
  41.              str = str + "["+bar.substring(0, bar.length() - 1)+"]";   
  42.          }   
  43.         return str;   
  44.      }   
  45. }  

Java代码 复制代码
  1. package test.digester;   
  2.   
  3. public class Bar {   
  4.     private String id;   
  5.   
  6.     private String title;   
  7.   
  8.     public String getId() {   
  9.         return id;   
  10.      }   
  11.   
  12.     public void setId(String id) {   
  13.         this.id = id;   
  14.      }   
  15.   
  16.     public String getTitle() {   
  17.         return title;   
  18.      }   
  19.   
  20.     public void setTitle(String title) {   
  21.         this.title = title;   
  22.      }   
  23.   
  24.     public String toString(){   
  25.          String str = "";   
  26.          str = "id="+getId()+";title="+getTitle()+";";   
  27.         return str;   
  28.      }   
  29. }  

这个2个bean中的toString方法,我是为了能够方便的看出转换后的内容是否正确而添加的。
还有一个xml文件也是放在包test. digester中,内容如下:
Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <foo name="The Parent">   
  3.    <bar id="123" title="The First Child"/>   
  4.    <bar id="456" title="The Second Child"/>   
  5.    <bar id="789" title="测试"/>   
  6. </foo>  

最后就是这个主处理文件:
代码如下:
Java代码 复制代码
  1. package test.digester;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.InputStream;   
  5. import java.net.MalformedURLException;   
  6. import java.net.URL;   
  7. import java.util.Enumeration;   
  8.   
  9. import org.apache.commons.digester.Digester;   
  10. import org.xml.sax.SAXException;   
  11.   
  12. public class DigesterTest {   
  13.     private Digester digester;   
  14.        
  15.     private static String filepath = "test/digester/test.xml";   
  16.        
  17.     public DigesterTest(){   
  18.         this.init();   
  19.      }   
  20.        
  21.     private void init(){   
  22.         digester = new Digester();   
  23.          ClassLoader classLoader = Thread.currentThread().getContextClassLoader();   
  24.          URL url = classLoader.getResource(filepath);   
  25.          Foo foo = new Foo();   
  26.         digester.setValidating(false);   
  27.         digester.push(foo);   
  28.         digester.addSetProperties("foo");   
  29.         digester.addObjectCreate("foo/bar", "test.digester.Bar");   
  30.         digester.addSetProperties("foo/bar");   
  31.         digester.addSetNext("foo/bar", "addBar", "test.digester.Bar");   
  32.         try{   
  33.             digester.parse(url);   
  34.              System.out.println(foo);   
  35.          }   
  36.         catch(IOException e){   
  37.              System.out.println(e);   
  38.          }   
  39.         catch(SAXException e){   
  40.              System.out.println(e);   
  41.          }   
  42.   
  43.      }   
  44.        
  45.     public static void main(String[] args){   
  46.          DigesterTest test = new DigesterTest();   
  47.      }   
  48. }  

这里的init方法也是可以写成:
Java代码 复制代码
  1. digester = new Digester();   
  2. ClassLoader classLoader = Thread.currentThread().getContextClassLoader();   
  3. URL url = classLoader.getResource(filepath);   
  4. digester.setValidating(false);   
  5. digester.addObjectCreate("foo", "test.digester.Foo");   
  6. digester.addSetProperties("foo");   
  7. digester.addObjectCreate("foo/bar", "test.digester.Bar");   
  8. digester.addSetProperties("foo/bar");   
  9. digester.addSetNext("foo/bar", "addBar", "test.digester.Bar");   
  10. try{   
  11.      Foo foo = (Foo)digester.parse(url);   
  12.      System.out.println(foo);   
  13. }   
  14. catch(IOException e){   
  15.      System.out.println(e);   
  16. }   
  17. catch(SAXException e){   
  18.      System.out.println(e);   
  19. }  

第一种是先new一个Foo,然后把这个Foo对象push到 digester中去,最后在parse转换之后,直接处理这个Foo对象就可以了。
第二种方式是 digester.addObjectCreate("foo", "test. digester.Foo");就是将Foo类的name传入,在parse中就会根据这个名字转换得到一个Foo对象,我们只要把返回结果转换为Foo就OK了。
在Struts1.3.9中作者是采用的push方法的, digester中还有其他的处理方法的,需要的时候可以自己找资料研究一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值