1 基本信息
摘要:
本文介绍了如何使用
JAXB
实现
XML
和
Java
对象绑定,通过
XML Schema
生成
Java
类,实现从
xml
数据文件生成
Java
对象树,以及将
Java
对象序列化到
XML
文件中。
分类
:
JAVA-XML
标签:
JAXB XML java
对象绑定
作者:
陈光耀 创建于2007-7-1
协助者:
2 正文
JAXB(Java Architecture for XML Binding, Java XML
绑定架构
)
是一项可以根据
XML Schema
产生
Java
类的技术。该技术可以提供将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便加载XML数据,并以XML文件作为数据存储方式。
下面以一个业务字典的例子来说明JAXB的使用。
我们的目的是将保存代码值和实际名称对应关系的业务字典数据(如“M”对应“男”,“F”对应“女”等)放在xml文件中,由java程序在运行的时候加载使用,同时也能将程序中生成的新的业务字典数据保存在xml文件中。
具体实现步骤如下:
1.设计出xml文件存储的格式(dict.xml), 如下:
- <dicts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <dictType dictTypeId="gender" dictTypeName="性别">
- <dictEntry dictId="M" dictName="male"/>
- <dictEntry dictId="F" dictName="female"/>
- <dictEntry dictId="M" dictName="unknown"/>
- </dictType>
- <dictType dictTypeId="country" dictTypeName="国家" level="1">
- <dictEntry dictId="CN" dictName="中国"/>
- <dictEntry dictId="US" dictName="美国"/>
- <dictEntry dictId="FR" dictName="法国"/>
- </dictType>
- <dictType dictTypeId="province" dictTypeName="省" level="2" parent="country">
- <dictEntry dictId="HB" dictName="河北" parent="CN"/>
- <dictEntry dictId="SD" dictName="山东" parent="CN"/>
- <dictEntry dictId="JX" dictName="江西" parent="CN"/>
- <dictEntry dictId="NEWY" dictName="纽约州" parent="US"/>
- <dictEntry dictId="ALBM" dictName="阿拉巴马州" parent="US"/>
- <dictEntry dictId="CALF" dictName="加利福尼亚州" parent="US"/>
- </dictType>
- <dictType dictTypeId="city" dictTypeName="城市" level="3" parent="province">
- <dictEntry dictId="SJZ" dictName="石家庄" parent="HB"/>
- <dictEntry dictId="LF" dictName="廊坊" parent="HB"/>
- <dictEntry dictId="JN" dictName="济南" parent="SD"/>
- <dictEntry dictId="QD" dictName="青岛" parent="SD"/>
- <dictEntry dictId="NC" dictName="南昌" parent="JX"/>
- <dictEntry dictId="JJ" dictName="九江" parent="JX"/>
- </dictType>
- </dicts>
说明: 本业务业务字典支持带层次的业务字典,如国家-省-市的业务字典。
2. 定出业务字典XML文档的Schema,dict.xsd, 如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- edited with XML Spy v4.2 U (http://www.xmlspy.com) by cgy (home) -->
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
- <!-- 定义根节点 -->
- <xs:element name="dicts">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="dictType" type="DictTypeDef" minOccurs="0" maxOccurs="unbounded"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- <!--业务字典类型-->
- <xs:complexType name="DictTypeDef">
- <xs:sequence>
- <xs:element name="dictEntry" type="DictEntryDef" maxOccurs="unbounded"/>
- </xs:sequence>
- <xs:attribute name="dictTypeId" type="xs:string" use="required"/>
- <xs:attribute name="dictTypeName" type="xs:string" use="required"/>
- <xs:attribute name="level" type="xs:int" use="optional"/>
- <xs:attribute name="parent" type="xs:string" use="optional"/>
- </xs:complexType>
- <!--业务字典项-->
- <xs:complexType name="DictEntryDef">
- <xs:attribute name="dictId" type="xs:string" use="required"/>
- <xs:attribute name="dictName" type="xs:string" use="required"/>
- <xs:attribute name="parent" type="xs:string" use="optional"/>
- <xs:attribute name="filter1" type="xs:string" use="optional"/>
- <xs:attribute name="filter2" type="xs:string" use="optional"/>
- </xs:complexType>
- </xs:schema>
3.使用JAXB将Schema生成用于xml数据解析的Java类。
到
jaxb
网站上下载
Jaxb
的最新安装包,如
JAXB RI 2.1.3
,
本文使用的是
JAXB RI 2.0.5
版本。下载后是一个安装用的
jar
文件,如
JAXB2_20070413.jar
,将其
copy
到
d:/jaxb2
目录下,运行
java -jar JAXB2_20070413.jar
将其解压,解压后的目录结构如下图:
4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" coordsize="21600,21600" o:spt="75" o:preferrelative="t">
将
xsd
文件拷贝到
d:/temp
目录下,编译
schema
文件:
cd d:/jaxb2/bin
d:/jaxb2/bin>xjc -d d:/temp/src -p com.primeton.governor.dict.xmlloader d:/temp/dict.xsd
(
注:
xjc.bat
即为
java -jar jaxb-xjc.jar %*)
在
d:/temp/src
目录下生成
Java
代码
,
如下图所示:
4
.使用生成的类加载业务字典数据,假设数据
dict.xml
放在
d:/temp
目录下
.
- JAXBContext jc = JAXBContext.newInstance("com.primeton.governor.dict.xmlloader");
- Unmarshaller u = jc.createUnmarshaller();
- InputStream in = new FileInputStream("d://temp//dictdata.xml");
- Dicts dictset = (Dicts) u.unmarshal(in);
- in.close();
- List<DictTypeDef> dictTypes = dictset.getDictType();
- for (int i = 0; i < dictTypes.size(); i++) {
- DictTypeDef typeDef = dictTypes.get(i);
- ... ...
- }
5.
保存业务字典的内存对象到
xml
文件中
:
- JAXBContext jc = JAXBContext.newInstance("com.primeton.governor.dict.xmlloader");
-
- Dicts dicts = new Dicts();
- DictTypeDef type = new DictTypeDef("cust_grade", "客户等级");
- type.addDictEntry(new DictEntryDef("1", "钻石级"));
- type.addDictEntry(new DictEntryDef("2", "白金级"));
- type.addDictEntry(new DictEntryDef("3", "黄金级"));
- type.addDictEntry(new DictEntryDef("4", "白银级"));
- type.addDictEntry(new DictEntryDef("5", "普通客户"));
- dicts.addDictType(type);
-
- type = new DictTypeDef("gender", "性别");
- type.addDictEntry(new DictEntryDef("M", "male"));
- type.addDictEntry(new DictEntryDef("F", "female"));
- type.addDictEntry(new DictEntryDef("U", "unknown"));
- dicts.addDictType(type);
-
- Marshaller m = jc.createMarshaller();
- m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); //set well-formated
-
- FileOutputStream os = new FileOutputStream("d://temp//dicts.xml");
- m.marshal(dicts, os);
- os.close();
生成的xml文件结果为:
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <dicts>
- <dictType dictTypeName="客户等级" dictTypeId="cust_grade">
- <dictEntry dictName="钻石级" dictId="1"/>
- <dictEntry dictName="白金级" dictId="2"/>
- <dictEntry dictName="黄金级" dictId="3"/>
- <dictEntry dictName="白银级" dictId="4"/>
- <dictEntry dictName="普通客户" dictId="5"/>
- </dictType>
- <dictType dictTypeName="性别" dictTypeId="gender">
- <dictEntry dictName="male" dictId="M"/>
- <dictEntry dictName="female" dictId="F"/>
- <dictEntry dictName="unknown" dictId="U"/>
- </dictType>
- </dicts>
|