IBM:XML 与 Java 技术: 用 Castor 进行数据绑定
StringReader reader=null; try { //strXML为XML文件内容 reader=new StringReader(strXML); MyJavaBean bean = (MyJavaBean)(Unmarshaller.unmarshal(MyJavaBean.class, reader)); return bean; } finally { if(reader!=null) { try { reader.close(); } catch(Exception e) {//TODO 日志 logger.error("fromXML:"+e.getMessage(),e); } } }
castor是一种将java对象和XML自动绑定的开源软件。它可以在java对象、XML文本、SQL数据表以及LDAP目录之间绑定,在XML数据交换方面很有用。
在业务开发中,我们曾试过这样的方法来让XML数据与JAVA对象进行转化:
Alarm.xml
<?xml version="1.0" encoding="GB2312"?> <alarm> <alarmType> 外部告警 </alarmType> <detailContent> 告警正文 </detailContent> </alarm>
Alarm.java
import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; // 告警实体类 public class Alarm { private String alarmType = null; private String detailContent = null; public Alarm(){ } public Alarm(String alarmType, String detailContent) { this.alarmType = alarmType; this.detailContent = detailContent; } public String getAlarmType() { return alarmType; } public void setAlarmType(String alarmType) { this.alarmType = alarmType; } public String getDetailContent() { return detailContent; } public void setDetailContent(String detailContent) { this.detailContent = detailContent; } public String toString() { ToStringBuilder builder = new ToStringBuilder(this); ToStringBuilder.setDefaultStyle(ToStringStyle.SIMPLE_STYLE); builder.append("alarmType", alarmType); builder.append("detailContent", detailContent); return builder.toString(); } }
Parser.java
import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; // 将XML数据转换为业务对象 // 方法一 public class Parser { public Alarm xml2Alarm(String xmlFileName) { Alarm alarm = null; String alarmType = null; String detailContent = null; SAXBuilder builder = new SAXBuilder(); Document doc = null; try { doc = builder.build(xmlFileName); } catch (JDOMException e) { e.printStackTrace(); } Element root = doc.getRootElement(); alarmType = root.getChildTextNormalize("alarmType"); detailContent = root.getChildTextNormalize("detailContent"); alarm = new Alarm(); alarm.setAlarmType(alarmType); alarm.setDetailContent(detailContent); return alarm; } public static void main(String[] args) { Parser parser = new Parser(); Alarm alarm = parser.xml2Alarm("d:/Alarm.xml"); System.out.println(alarm); } }
这种将XML数据转换到JAVA对象的过程可以表示为:XML文件->提取数据->填充业务对象。开发过程首先要用XML API对XML文件的结构和数据进行操作,获取其中的具体数据,然后再将其填充到具体对象中,产生业务对象。这样面对数据操作的方法对于复杂的业务对象(比如20、30个属性的业务对象很常见)将需要很大的开发工作量,并且容易出错,维护困难。再来看看另一种方法:
Parser2.java
import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.ValidationException; import org.xml.sax.InputSource; // 将XML数据转换为业务对象 // 方法二 public class Parser2 { public Alarm xml2Alarm(String xmlFileName) { Alarm alarm = null; try { alarm = (Alarm) Unmarshaller.unmarshal(Alarm.class, new InputSource(xmlFileName)); } catch (MarshalException e) { e.printStackTrace(); } catch (ValidationException e) { e.printStackTrace(); } return alarm; } public static void main (String[] args) { Parser2 parser = new Parser2(); Alarm alarm = parser.xml2Alarm("d:/Alarm.xml"); System.out.println(alarm); } }
第二种将XML文件转换为JAVA对象的过程可以表示为:XML数据->业务对象。开发过程直接将XML文件解组为业务对象,编码简洁,不需要做更多的转换或填充。这种由一套API直接将XML文档转换为JAVA对象的方法,我们称之为XML数据绑定。可以实现数据绑定的API或软件包在JAVA领域有很多种,比如SUN的JAXB、Exolab的Castor,还有Quick、Zeus。这里我主要以Castor为例。