逝者如斯夫

静而思之
数据加载中……

关于JavaBean和XML的转换

今天试了个XML和JavaBean转换的软件JOX,之前一直有这样的需求,但比较来比较去还是这个比较简单实用。我想除非我有WS的需求,否则象JIBX和APACHE 的WS工具对我来说都是重量级的。

先看看输出结果:

            
  
<? xml version="1.0" encoding="ISO-8859-1" ?>
  
< ApproxItem  java-class ="com.greatwall.csi.np.model.ApproxItem" >
      
< expose  java-class ="java.lang.Double" > 0.23 </ expose >
      
< list  java-class ="com.greatwall.csi.np.model.ApproxInfo" >
          
< IDno > bbb </ IDno >
          
< birth  java-class ="java.lang.Integer" > 222 </ birth >
      
</ list >
      
< map  java-class ="java.util.HashMap" >
          
< dd  java-class ="com.greatwall.csi.np.model.ApproxInfo" >
              
< IDno > bbb </ IDno >
              
< birth  java-class ="java.lang.Integer" > 222 </ birth >
          
</ dd >
          
< ss  java-class ="com.greatwall.csi.np.model.ApproxInfo" >
              
< IDno > bbb </ IDno >
              
< birth  java-class ="java.lang.Integer" > 222 </ birth >
          
</ ss >
      
</ map >
      
< month  java-class ="java.lang.Integer" > 3923 </ month >
  
</ ApproxItem >  

在看看原来的JavaBean:

   package  com.greatwall.csi.np.model;

  
import  java.util.ArrayList;
  
import  java.util.HashMap;

  
public   class  ApproxItem {
      
public   int  getMonth() {
          
return  month;
      }

      
public   void  setMonth( int  month) {
          
this .month  =  month;
      }

      
public   double  getExpose() {
          
return  expose;
      }

      
public   void  setExpose( double  expose) {
          
this .expose  =  expose;
      }

      
public  ArrayList getList() {
          
return  list;
      }

      
public  HashMap getMap() {

          
return  map;
      }

      
public   void  setList(ArrayList list) {
          
this .list  =  list;
      }

      
public   void  setMap(HashMap map) {
          
this .map  =  map;
      }

      
private   int  month;
      
private   double  expose;
      
private  ArrayList list;
      
private  HashMap map;
  }

处理结果是令人满意的。实现过程如下:


public   class  JOXUtils {

    
/**
     * Retrieves a bean object for the
     * received XML and matching bean class
     
*/
    
public   static  Object fromXML(String xml, Class className) {
        ByteArrayInputStream xmlData 
=   new  ByteArrayInputStream(xml.getBytes());
        JOXBeanInputStream joxIn 
=   new  JOXBeanInputStream(xmlData);
        
try  {
            
return  (Object) joxIn.readObject(className);
        } 
catch  (IOException exc) {
            exc.printStackTrace();
            
return   null ;
        }
        
finally  {
            
try  {
                xmlData.close();
                joxIn.close();
            } 
catch  (Exception e) {
                e.printStackTrace();
            }
        }
    }

    
/**
     * Returns an XML document String for the received bean
     
*/
    
public   static  String toXML(Object bean) {
        ByteArrayOutputStream xmlData 
=   new  ByteArrayOutputStream();
        JOXBeanOutputStream joxOut 
=   new  JOXBeanOutputStream(xmlData);
        
try  {
            joxOut.writeObject(beanName(bean), bean);
            
return  xmlData.toString();
        } 
catch  (IOException exc) {
            exc.printStackTrace();
            
return   null ;
        }
        
finally  {
            
try  {
                xmlData.close();
                joxOut.close();
            } 
catch  (Exception e) {
                e.printStackTrace();
            }
        }
    }

    
/**
     * Find out the bean class name
     
*/
    
private   static  String beanName(Object bean) {
        String fullClassName 
=  bean.getClass().getName();
        String classNameTemp 
=  fullClassName.substring(
            fullClassName.lastIndexOf(
" . " +   1 ,
            fullClassName.length()
            );
        
return  classNameTemp.substring( 0 1 )
            
+  classNameTemp.substring( 1 );
    }
    
    
public   static   void  main(String[] args) {
        ApproxItem approxItem 
=   new  ApproxItem();
        approxItem.setMonth(
3923 );
        approxItem.setExpose(
0.23 );
        approxItem.setMap(
new  HashMap());
        ApproxInfo approxInfo 
=   new  ApproxInfo();
        approxInfo.setBirth(
111 );
        approxInfo.setIDno(
" aaa " );
        approxItem.getMap().put(
" ss " , approxInfo);
        approxInfo.setBirth(
222 );
        approxInfo.setIDno(
" bbb " );
        approxItem.getMap().put(
" dd " , approxInfo);
        approxItem.setList(
new  ArrayList( 1 ));
        approxItem.getList().add(approxInfo);
        System.out.println(
" JOXUtils.toXML(approxItem)= " );
       System.out.println(JOXUtils.toXML(approxItem));
    }

Wutka Consulting还提供了一个比较有趣的工具,Java2DTD,自从使用JDO做持久层框架,我就一直想找一个这样的工具,因为JDO的映射文件并没有将全部的JavaBean类描述到.jdo文件,所以在编程环境下一直无法获取所有的实体类和字段的一个描述情况。废话少说,马上试一下。运行时需要3个包文件:beantodtd,需要转换的实体classes,dtdparser。

java -cp beantodtd-1.0;classes;d:/policy38/lib/dtdparser121.jar; BeanToDTD \n
 -
mixed com.greatwall.csi.bs.model.PersonBase

-mixed参数是指定按JavaBean中的变量名生成属性,还有些其它的参数,可以控制大小写和连字符号等。另外由于我用的实体是JDO增强过的class文件,所以classpath还需要加上JDO实现的包。


运行的结果有少少无奈,因为对于JavaBean中List这样的容器字段类型,无法让它识别出对象的类型,只能生成类似<!ELEMENT pension ANY>这样的描述,如果在一个什么配置文件中可以设置的话那就更好了。

另外还有一个DTD解析工具,可以解析DTD文件,目前还不知道有什么其它用途,使用如下方法可以解析后输出控制台:

java -classpath d:/policy38/lib/dtdparser121.jar com.wutka.dtd.Tokenize code.dtd

资源:

http://www.wutka.com/download.html

posted on 2007-03-23 19:02 ideame 阅读(6146) 评论(3)  编辑  收藏 所属分类: Java

评论

# re: 关于JavaBean和XML的转换[未登录]  回复  更多评论   

我用jaxb绑定xml,然后dozer拷贝数据生成xml
试试你这个看能不能满足我的项目需求
2007-03-24 00:49 | tornado

# re: 关于JavaBean和XML的转换  回复  更多评论   

@tornado
试了一下,dozer 最新版本不支持 jdk 1.4 的吗?
2007-04-20 17:07 | ideame

# re: 关于JavaBean和XML的转换  回复  更多评论   

hi,你好,我也在搞这个,觉的这个比较方便,可就是碰到LIST 就比较麻烦,网上找来找去没这样的例子,几天在你这里看到了,谢谢!可我还有问题,比如
我的XML文件是
<?xml version="1.0" encoding="gb2312" ?>
<MarkTest>
<list java-class="java.util.ArrayList">
<l1 java-class="com.wolftel.cxGprs.test.JoxBean">
<name>sg</name>
<age>13</age>
</l1>
</list>
<address>杭州</address>
</MarkTest>
我的类是这样的
public class TestXML {
private String address;
private ArrayList list;

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public ArrayList getList() {
return list;
}

public void setList(ArrayList list) {
this.list = list;
}

}

public class JoxBean {
private int age;
private String name;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

运行类
public class JoxUtil {
public static void main(String[] args) throws IOException {
JOXBeanInputStream joxIn = new JOXBeanInputStream(JoxUtil.class.getResourceAsStream("test2.xml"));
TestXML t = (TestXML)joxIn.readObject(TestXML.class);
ArrayList list = t.getList();
for (Object aList : list) {
JoxBean b = (JoxBean) aList;
System.out.println(b.getAge() + "___" + b.getName());
}
System.out.println(t.getAddress());

}
}
然后无法得到那个LIST啊,如何解决?

2007-08-13 17:00 | SG

只有注册用户登录后才能发表评论。


网站导航: