关于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 -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
推荐阅读
-
关于JavaBean和XML的转换
-
关于JavaBean和XML的转换
-
PHP utf-8和gb2312编码转换乱码的问题
-
jQuery对象和Javascript对象之间转换的实例代码_jquery
-
关于symfony传递值和twig里面的asset的问题
-
兄台息怒,关于arguments,您的想法和大神是一样一样的----闲聊JS中的apply和call
-
实例详解简单实体类和xml文件的相互转换方法
-
穿戴设备的未来是关于情感感知和减压技术
-
Go中 字符切片[]byte 和 字符串string 的相互转换
-
IdentityServer4关于多客户端和API的最佳实践【含多类型客户端和API资源,以及客户端分组实践】【中】