二、建立XML数据绑定的方法
Castor建立数据绑定的方法有两种,一种是生成类,另一种的映射文件。
1、生成类。Castor通过org.xml.castor.xml.SourceGenerator处理类的生成。首先,我们要用XML Schema来建立一套模型,用以表示JAVA对象的数据结构。做个简单的例子,前面Alarm.java类似的数据结构用XML Schema来表示为:
Alarm.xsd
<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://castor.test.raistlin.com">
<xsd:annotation>
<xsd:documentation>Alarm 对象XML Schema文件.</xsd:documentation>
</xsd:annotation>
<xsd:element name="alarm">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="alarmType" type="xsd:string"/>
<xsd:element name="detailContent" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
有了Schema文件,下面要做的是执行命令:
java -classpath lib/castor-0.9.9.1.jar;lib/xerces-J_1.4.0.jar;lib/jakarta-regexp-1.1.jar org.exolab.castor.builder.SourceGenerator -i d:\Alarm.xsd -package com.raistlin.test.castor -dest alarm -types j2
其中常用参数说明如下:
-i 指定XML Schema文件;
-package 指定生成类的包名;
-dest 指定成生类源文件存放路径;
-verbost 显示类生成过程中的额外信息;
-nodesc 不生成类的Descriptor文件;
-types 生成类中的集合类型,j2为java2中java.util.List类型;
-nomarshall 生成类不包括marshal()方法;
执行完毕后,在alarm目录就会按包路径建立目录结构,同时会产生Alarm.java、AlarmDescriptor.java两个JAVA文件。其中Alarm.java包含所有属性的访问和转变方法;AlarmDescriptor.java包含了命名空间信息、验证方法等。有了这两个文件,生成类过程就算完成了,已经准备好正确的实现XML数据的转化的条件。具体生成的源文件可以自己试着生成后看一下,这里不再列出。项目中基础平台的数据字典和查询框架模型就使用了这种方法,有兴趣可以学习一下配置库上的源码。
2、映射文件。如果项目在决定使用Castor前已经实现过了实体类的设计,但是现在又需要进行XML数据绑定。这时,可以使用映射文件的方式来手工指定XML数据与JAVA对象属性之间的映射关系,并以定义的关系为规则,完成XML数据与JAVA对象之间的转化。
对于Alarm.java可以编写映射文件如下:
AlarmMapping.xml
<?xml version="1.0"?>
<mapping>
<class name="com.raistlin.test.castor.Alarm">
<map-to xml="alarm"/>
<field name="alarmType" type="string">
<bind-xml name="alarmType"/>
</field>
<field name="detailContent" type="string">
<bind-xml name="detailContent"/>
</field>
</class>
</mapping>
文件通过class指定xml根元素对应的JAVA类,然后依次指定XML中各元素对应JAVA类中的哪个字段,以及数据类型(Castor也支持自定义类型)。这样就手工完成了XML数据与JAVA对象之间的绑定映射。但是在实践中,如果开始定义的JAVA类的数据类型不被Castor支持,在执行映射时会抛出异常,数据不能被正常转化(比如java.sql.Timestamp、java.util.Calendar等)。所以定义对象时,尽量使用简单常用的数据类型。