JAXB实现xml与java对象的
来源:互联网 发布:淘宝茶叶店铺前十 编辑:程序博客网 时间:2024/05/16 14:38
1 基本信息
摘要:
本文介绍了如何使用JAXB实现XML和Java对象绑定,通过XML Schema生成Java类,实现从xml数据文件生成Java对象树,以及将Java对象序列化到XML文件中。
分类:JAVA-XML
标签:JAXB XML java对象绑定
作者:陈光耀 创建于
协助者:
2 正文
JAXB(Java Architecture for XML Binding, Java XML绑定架构)是一项可以根据XML Schema产生Java类的技术。该技术可以提供将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便加载XML数据,并以XML文件作为数据存储方式。
JAXB目前最新版本为
下面以一个业务字典的例子来说明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
java -jar JAXB2_20070413.jar
将其解压,解压后的目录结构如下图:
将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>
(构客网原创)
牛者恒牛 于 2007年08月27日 12:50:28
- JAXB实现xml与java对象的
- Jaxb实现Java对象与XML之间的转换
- JAXB 可以实现Java对象与XML的相互转换
- java中JAXB标准实现java对象与xml互转
- xml-xml与java对象之间的转换(jaxb)
- JAXB 实现java对象与xml之间互相转换(一)
- JAXB 实现java对象与xml之间互相转换(二)
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- 使用JAXB类库实现JAVA对象与XML互转
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- 使用JAXB类库实现XML与JAVA对象的互转
- 利用JAXB实现java对象和xml的相互转换
- 开始总是最难的,坚持下去我没信心。
- C/C++面试之算法系列--从"反转32 位数"算法题分析面试策略
- DataGrid导出excel和word的例子
- IIS安装配置中的问题
- 异常处理随笔
- JAXB实现xml与java对象的
- 直面IT业界众多挑战 英特尔启动商务博锐
- ASP.NET (C#)动态添加控键
- 十二星座八月运势详解
- 用javascript动态调整iframe高度
- xstream
- Exchange Server 2003 Message Security Guide
- Windows Mobile 05 系统数据库卷
- CVS使用手册