一、什么是 XML 数据绑定
在业务开发中,我们曾试过这样的方法来让XML数据与JAVA对象进行转化:
Alarm.xml
<?xml version="1.0" encoding="GB2312"?>
<alarm>
<alarmType>
外部告警
</alarmType>
<detailContent>
告警正文
</detailContent>
</alarm>
Alarm.java
package com.raistlin.test.castor;
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
package com.raistlin.test.castor;
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
package com.raistlin.test.castor;
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为例。