org.apache.commons.
digester这个包提供了一个工具,可以很迅速的将一个xml文件转换为一个bean。
下面的这个例子,包括有2个bean文件,一个xml文件,一个java主处理文件。
2个bean的代码如下:
- package test.digester;
- import java.util.ArrayList;
- import java.util.List;
-
- public class Foo {
- private List<Bar> bars;
- private String name;
-
- public void addBar(Bar bar){
- if (bars==null){
- bars = new ArrayList<Bar>();
- }
- bars.add(bar);
- }
-
- public List getBars() {
- return bars;
- }
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
-
- public String toString(){
- String str = "";
- str = "name=" + getName() + ";";
- List list = getBars();
- if (list==null){
- return str;
- }
- int len = list.size();
- String bar = "";
- for(int i=0;i<len;i++){
- Bar b = (Bar)getBars().get(i);
- bar = bar + "{"+b.toString()+"},";
- }
- if (bar.length()>0){
- str = str + "["+bar.substring(0, bar.length() - 1)+"]";
- }
- return str;
- }
- }
- package test.digester;
-
- public class Bar {
- private String id;
-
- private String title;
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String toString(){
- String str = "";
- str = "id="+getId()+";title="+getTitle()+";";
- return str;
- }
- }
这个2个bean中的toString方法,我是为了能够方便的看出转换后的内容是否正确而添加的。
还有一个xml文件也是放在包test.
digester中,内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <foo name="The Parent">
- <bar id="123" title="The First Child"/>
- <bar id="456" title="The Second Child"/>
- <bar id="789" title="测试"/>
- </foo>
最后就是这个主处理文件:
代码如下:
- package test.digester;
-
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.util.Enumeration;
-
- import org.apache.commons.digester.Digester;
- import org.xml.sax.SAXException;
-
- public class DigesterTest {
- private Digester digester;
-
- private static String filepath = "test/digester/test.xml";
-
- public DigesterTest(){
- this.init();
- }
-
- private void init(){
- digester = new Digester();
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- URL url = classLoader.getResource(filepath);
- Foo foo = new Foo();
- digester.setValidating(false);
- digester.push(foo);
- digester.addSetProperties("foo");
- digester.addObjectCreate("foo/bar", "test.digester.Bar");
- digester.addSetProperties("foo/bar");
- digester.addSetNext("foo/bar", "addBar", "test.digester.Bar");
- try{
- digester.parse(url);
- System.out.println(foo);
- }
- catch(IOException e){
- System.out.println(e);
- }
- catch(SAXException e){
- System.out.println(e);
- }
-
- }
-
- public static void main(String[] args){
- DigesterTest test = new DigesterTest();
- }
- }
这里的init方法也是可以写成:
- digester = new Digester();
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- URL url = classLoader.getResource(filepath);
- digester.setValidating(false);
- digester.addObjectCreate("foo", "test.digester.Foo");
- digester.addSetProperties("foo");
- digester.addObjectCreate("foo/bar", "test.digester.Bar");
- digester.addSetProperties("foo/bar");
- digester.addSetNext("foo/bar", "addBar", "test.digester.Bar");
- try{
- Foo foo = (Foo)digester.parse(url);
- System.out.println(foo);
- }
- catch(IOException e){
- System.out.println(e);
- }
- catch(SAXException e){
- System.out.println(e);
- }
第一种是先new一个Foo,然后把这个Foo对象push到
digester中去,最后在parse转换之后,直接处理这个Foo对象就可以了。
第二种方式是
digester.addObjectCreate("foo", "test.
digester.Foo");就是将Foo类的name传入,在parse中就会根据这个名字转换得到一个Foo对象,我们只要把返回结果转换为Foo就OK了。
在Struts1.3.9中作者是采用的push方法的,
digester中还有其他的处理方法的,需要的时候可以自己找资料研究一下。