JAXB实现XML和Java对象绑定

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目前最新版本为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 ,将其 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 目录下 .

  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>
 
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值