JAXB实现xml与java对象的

来源:互联网 发布:淘宝茶叶店铺前十 编辑:程序博客网 时间:2024/05/16 14:38

1       基本信息

摘要:

本文介绍了如何使用JAXB实现XMLJava对象绑定,通过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目前最新版本为2.1.3, 大家可以到 https://jaxb.dev.java.net/ 网站去下载最新的开源版本。

下面以一个业务字典的例子来说明JAXB的使用。

我们的目的是将保存代码值和实际名称对应关系的业务字典数据(如“M”对应“男”,“F”对应“女”等)放在xml文件中,由java程序在运行的时候加载使用,同时也能将程序中生成的新的业务字典数据保存在xml文件中。

(构客网原创)

具体实现步骤如下:

1.设计出xml文件存储的格式(dict.xml), 如下:

 


  1. <dicts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  2.       <dictType dictTypeId="gender" dictTypeName="性别">
  3.             <dictEntry dictId="M" dictName="male"/>
  4.             <dictEntry dictId="F" dictName="female"/>
  5.             <dictEntry dictId="M" dictName="unknown"/>
  6.       </dictType>
  7.       <dictType dictTypeId="country" dictTypeName="国家" level="1">
  8.             <dictEntry dictId="CN" dictName="中国"/>
  9.             <dictEntry dictId="US" dictName="美国"/>
  10.             <dictEntry dictId="FR" dictName="法国"/>
  11.       </dictType>
  12.       <dictType dictTypeId="province" dictTypeName="省" level="2" parent="country">
  13.             <dictEntry dictId="HB" dictName="河北" parent="CN"/>
  14.             <dictEntry dictId="SD" dictName="山东" parent="CN"/>
  15.             <dictEntry dictId="JX" dictName="江西" parent="CN"/>
  16.             <dictEntry dictId="NEWY" dictName="纽约州" parent="US"/>
  17.             <dictEntry dictId="ALBM" dictName="阿拉巴马州" parent="US"/>
  18.             <dictEntry dictId="CALF" dictName="加利福尼亚州" parent="US"/>
  19.       </dictType>
  20.       <dictType dictTypeId="city" dictTypeName="城市" level="3" parent="province">
  21.             <dictEntry dictId="SJZ" dictName="石家庄" parent="HB"/>
  22.             <dictEntry dictId="LF" dictName="廊坊" parent="HB"/>
  23.             <dictEntry dictId="JN" dictName="济南" parent="SD"/>
  24.             <dictEntry dictId="QD" dictName="青岛" parent="SD"/>
  25.             <dictEntry dictId="NC" dictName="南昌" parent="JX"/>
  26.             <dictEntry dictId="JJ" dictName="九江" parent="JX"/>
  27.       </dictType>
  28. </dicts>

 

说明: 本业务业务字典支持带层次的业务字典,如国家-省-市的业务字典。

2. 定出业务字典XML文档的Schema,dict.xsd, 如下:


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- edited with XML Spy v4.2 U (http://www.xmlspy.com) by cgy (home) -->
  3. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  4.       <!-- 定义根节点 -->
  5.       <xs:element name="dicts">
  6.             <xs:complexType>
  7.                   <xs:sequence>
  8.                         <xs:element name="dictType" type="DictTypeDef" minOccurs="0" maxOccurs="unbounded"/>
  9.                   </xs:sequence>
  10.             </xs:complexType>
  11.       </xs:element>
  12.       <!--业务字典类型-->
  13.       <xs:complexType name="DictTypeDef">
  14.             <xs:sequence>
  15.                   <xs:element name="dictEntry" type="DictEntryDef" maxOccurs="unbounded"/>
  16.             </xs:sequence>
  17.             <xs:attribute name="dictTypeId" type="xs:string" use="required"/>
  18.             <xs:attribute name="dictTypeName" type="xs:string" use="required"/>
  19.             <xs:attribute name="level" type="xs:int" use="optional"/>
  20.             <xs:attribute name="parent" type="xs:string" use="optional"/>
  21.       </xs:complexType>
  22.       <!--业务字典项-->
  23.       <xs:complexType name="DictEntryDef">
  24.             <xs:attribute name="dictId" type="xs:string" use="required"/>
  25.             <xs:attribute name="dictName" type="xs:string" use="required"/>
  26.             <xs:attribute name="parent" type="xs:string" use="optional"/>
  27.             <xs:attribute name="filter1" type="xs:string" use="optional"/>
  28.             <xs:attribute name="filter2" type="xs:string" use="optional"/>
  29.       </xs:complexType>
  30. </xs:schema>


 (构客网原创)

3.使用JAXB将Schema生成用于xml数据解析的Java类。

jaxb网站上下载Jaxb的最新安装包,如JAXB RI 2.1.3 本文使用的是JAXB RI 2.0.5版本。下载后是一个安装用的jar文件,如JAXB2_20070413.jar,将其copyd:/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目录下.


  1. JAXBContext jc = JAXBContext.newInstance("com.primeton.governor.dict.xmlloader");
  2. Unmarshaller u = jc.createUnmarshaller();
  3. InputStream in = new FileInputStream("d://temp//dictdata.xml");
  4. Dicts dictset = (Dicts) u.unmarshal(in);
  5. in.close();
  6. List<DictTypeDef> dictTypes = dictset.getDictType();
  7. for (int i = 0; i < dictTypes.size(); i++) {
  8.       DictTypeDef typeDef = dictTypes.get(i);
  9.       ... ...
  10. }


 

5. 保存业务字典的内存对象到xml文件中:


  1. JAXBContext jc = JAXBContext.newInstance("com.primeton.governor.dict.xmlloader");
  2.  
  3. Dicts dicts = new Dicts();
  4. DictTypeDef type = new DictTypeDef("cust_grade", "客户等级");
  5. type.addDictEntry(new DictEntryDef("1", "钻石级"));
  6. type.addDictEntry(new DictEntryDef("2", "白金级"));
  7. type.addDictEntry(new DictEntryDef("3", "黄金级"));
  8. type.addDictEntry(new DictEntryDef("4", "白银级"));
  9. type.addDictEntry(new DictEntryDef("5", "普通客户"));
  10. dicts.addDictType(type);
  11.  
  12. type = new DictTypeDef("gender", "性别");
  13. type.addDictEntry(new DictEntryDef("M", "male"));
  14. type.addDictEntry(new DictEntryDef("F", "female"));
  15. type.addDictEntry(new DictEntryDef("U", "unknown"));
  16. dicts.addDictType(type);
  17.  
  18. Marshaller m = jc.createMarshaller();
  19. m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);      //set well-formated
  20.  
  21. FileOutputStream os = new FileOutputStream("d://temp//dicts.xml");
  22. m.marshal(dicts, os);
  23. os.close();

(构客网原创)
 

生成的xml文件结果为:


  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <dicts>
  3.       <dictType dictTypeName="客户等级" dictTypeId="cust_grade">
  4.             <dictEntry dictName="钻石级" dictId="1"/>
  5.             <dictEntry dictName="白金级" dictId="2"/>
  6.             <dictEntry dictName="黄金级" dictId="3"/>
  7.             <dictEntry dictName="白银级" dictId="4"/>
  8.             <dictEntry dictName="普通客户" dictId="5"/>
  9.       </dictType>
  10.       <dictType dictTypeName="性别" dictTypeId="gender">
  11.             <dictEntry dictName="male" dictId="M"/>
  12.             <dictEntry dictName="female" dictId="F"/>
  13.             <dictEntry dictName="unknown" dictId="U"/>
  14.       </dictType>
  15. </dicts>

(构客网原创)

8月26日 15:05:29
牛者恒牛 于 2007年08月27日 12:50:28

原创粉丝点击