- 浏览: 398597 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (760)
- 股票日志 (26)
- Selenium (0)
- selenium 2 环境的搭建 (1)
- 并发 (7)
- 框架开发 (1)
- 动态代理 (2)
- Struts2 (2)
- POI (2)
- jdk (3)
- maven (31)
- spring (35)
- mysql (31)
- 工作机会 (3)
- xtream (1)
- oracle dbms_metadata GET_DDL (0)
- SSI (1)
- DB (61)
- powermock (4)
- java 基础 (25)
- 多线程 (11)
- 高手 (2)
- java 底层 (2)
- 专业网站 (1)
- 开发联想 (1)
- 开发联想 (1)
- bat文件 (2)
- 清queue 语句 (1)
- 清queue 语句 (1)
- jquery (7)
- html5 (1)
- Jenkins (10)
- Linux (17)
- 工作issue (2)
- tomcat log (3)
- jvm (23)
- 项目细节 (0)
- oracle (41)
- 泛型 (3)
- 新知识点 (1)
- 数据库ddl 语句 (0)
- AQ (2)
- jms (0)
- 网络资源 (6)
- github (6)
- Easymock (1)
- Dom 解析XML (1)
- windows命令 (2)
- java (7)
- 正则表达式 (5)
- sequence (1)
- oracle 表meta信息 (1)
- 小工具技巧 (1)
- 辅助工具 (1)
- Junit (1)
- 泛型 generic (2)
- Java程序设计 (1)
- cglib (2)
- 架构师之路 (1)
- 数据库连接池 (5)
- c3p0 (1)
- eclipse使用 (1)
- oracle sql plus (1)
- 码农人生 (3)
- SVN (15)
- sqlplus (2)
- jsoup (1)
- 网络爬虫 (2)
- 新技能 (1)
- zookeeper (4)
- hadoop (1)
- SVNKIT (1)
- 从工具到知识点的整理 (1)
- log4j (13)
- 读文件 (0)
- 转义字符 (1)
- command (1)
- web service (3)
- 锁 (1)
- shell 脚本 (1)
- 遇到的错误 (2)
- tomcat (14)
- 房产 (5)
- bootstrap jquery ui (1)
- easyui (2)
- 个人征信 (1)
- 读写分离 (1)
- 备份 (1)
- rmi (6)
- webservice (1)
- JMX (4)
- 内存管理 (3)
- java设计 (1)
- timer (1)
- lock (2)
- concurrent (2)
- collection (1)
- tns (1)
- java基础 (15)
- File (1)
- 本机资源 (1)
- bat (1)
- windows (4)
- 数据结构 (3)
- 代码安全 (1)
- 作用域 (1)
- 图 (2)
- jvm内存结构 (1)
- 计算机思想 (1)
- quartz (6)
- Mongo DB (2)
- Nosql (4)
- sql (5)
- 第三方Java 工具 jar 项目 (2)
- drools (1)
- java swing (2)
- 调用console (1)
- runtime (1)
- process (1)
- swing (2)
- grouplayout (1)
- dubbo (0)
- bootstrap (0)
- nodejs (2)
- SVN hooks (1)
- jdbc (3)
- jdbc error (1)
- precedure (1)
- partition_key (1)
- active mq (1)
- blob (2)
- Eclipse (6)
- web server (1)
- bootstrapt (2)
- struts (1)
- ajax (1)
- js call back (1)
- 思想境界拓展 (1)
- JIRA (1)
- log (1)
- jaxb (3)
- xml java互相转换 (1)
- 装修 (2)
- 互联网 (2)
- threadlocal (3)
- mybatis (22)
- xstream (1)
- 排序 (1)
- 股票资源 (1)
- RPC (2)
- NIO (3)
- http client (6)
- 他人博客 (1)
- 代理服务器 (1)
- 网络 (2)
- web (1)
- 股票 (5)
- deadlock (1)
- JConsole (2)
- activemq (3)
- oralce (1)
- 游标 (1)
- 12月13日道富内部培训 (0)
- grant (1)
- 速查 (2)
- classloader (4)
- netty (4)
- 设计模式 (2)
- 缓存 (2)
- ehcache (2)
- framework (1)
- 内存分析 (2)
- dump (1)
- memory (2)
- 多高线程,并发 (1)
- hbase (2)
- 分布式系统 (1)
- socket (3)
- socket (1)
- 面试问题 (1)
- jetty (2)
- http (2)
- 源码 (1)
- 日志 (2)
- jni (1)
- 编码约定 (1)
- memorycache (1)
- redis (13)
- 杂谈 (1)
- drool (1)
- blockingqueue (1)
- ScheduledExecutorService (1)
- 网页爬虫 (1)
- httpclient (4)
- httpparser (1)
- map (1)
- 单例 (1)
- synchronized (2)
- thread (1)
- job (1)
- hashcode (1)
- copyonwriteArrayList (2)
- 录制声音 (1)
- java 标准 (2)
- SSL/TLS (1)
- itext (1)
- pdf (1)
- 钻石 (2)
- sonar (1)
- unicode (1)
- 编码 (4)
- html (1)
- SecurityManager (1)
- 坑 (1)
- Restful (2)
- svn hook (1)
- concurrentHashMap (1)
- 垃圾回收 (1)
- vbs (8)
- visual svn (2)
- power shell (1)
- wmi (3)
- mof (2)
- c# (1)
- concurrency (1)
- 劳动法 (1)
- 三国志游戏 (2)
- 三国 (1)
- 洪榕 (2)
- 金融投资知识 (1)
- motan (1)
- tkmybatis mapper (1)
- 工商注册信息查询 (1)
- consul (1)
- 支付业务知识 (2)
- 数据库备份 (1)
- 字段设计 (1)
- 字段 (1)
- dba (1)
- 插件 (2)
- PropEdit插件 (1)
- web工程 (1)
- 银行业知识 (2)
- 国内托管银行 (1)
- 数据库 (1)
- 事务 (2)
- git (18)
- component-scan (1)
- 私人 (0)
- db2 (14)
- alias (1)
- 住房 (1)
- 户口 (1)
- fastjson (1)
- test (6)
- RSA (2)
- 密钥 (1)
- putty (1)
- sftp (1)
- 加密 (1)
- 公钥私钥 (3)
- markdown (1)
- sweet (1)
- sourcetree (1)
- 好工具 (1)
- cmd (1)
- scp (1)
- notepad++ (1)
- ssh免密登录 (1)
- https (1)
- ssl (2)
- js (2)
- h2 (1)
- 内存 (2)
- 浏览器 (1)
- js特效 (1)
- io (1)
- 乱码 (1)
- 小工具 (1)
- 每周技术任务 (1)
- mongodb (7)
- 内存泄漏 (1)
- 码云 (2)
- 如何搭建java 视频服务器 tomcat (1)
- 资源 (1)
- 书 (1)
- 四色建模法 (1)
- 建模 (1)
- 配置 (1)
- 职位 (1)
- nginx (1)
- excel (1)
- log4j2 (2)
- 做菜 (1)
- jmap (1)
- jspwiki (1)
- activiti (1)
- 工作流引擎 (1)
- 安卓 (1)
- acitviti 例子 (1)
- 二维码 (1)
- 工作流 (1)
- powerdesign (2)
- 软件设计 (1)
- 乐观锁 (1)
- 王者荣耀 (1)
- session (2)
- token (5)
- cookie (4)
- springboot (24)
- jwt (2)
- 项目路径 (1)
- magicbook (1)
- requestType (1)
- json (2)
- swagger (1)
- eolinker (1)
- springdata (1)
- springmvc (1)
- controlleradvice (1)
- profile (1)
- 银行四要素 (1)
- 支付人员资源 (1)
- 支付渠道 (1)
- yaml (1)
- 中文编码 (1)
- mongo (2)
- serializable (1)
- 序列化 (1)
- zyd (1)
- unittest (1)
- 工具 (1)
- Something (1)
- 通达信 (1)
- protobuf (1)
- 算法 (1)
- springcloud (2)
- hikari (1)
- rocketmq (7)
- cachecloud (1)
- serfj (1)
- axure (1)
- lombok (1)
- 分布式锁 (1)
- 线程 (2)
- 同步代码块 (1)
- cobar (1)
- mq (1)
- rabbitmq (1)
- 定时执行 (1)
- 支付系统 (3)
- 唱歌 (1)
- elasticjob (1)
- 定时任务 (1)
- 界面 (1)
- flink (2)
- 大数据 (1)
- 接私活 (0)
- 内部培训 (2)
最新评论
-
dannyhz:
做股票从短线 试水,然后 慢慢发现 波段和 中期的故事可挖, ...
搭台唱戏 -
dannyhz:
http://developer.51cto.com/art/ ...
如何自己开发框架 它的注意点是什么
http://blog.csdn.net/wugouzi/article/details/25044655/
一、简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即将转换的JavaBean中添加annotation注解。
二、重要概念
•JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
•Marshaller接口,将Java对象序列化为XML数据。
•Unmarshaller接口,将XML数据反序列化为Java对象。
•@XmlType,将Java类或枚举类型映射到XML模式类型
•@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
•@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
•@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
•@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
•@XmlRootElement,将Java类或枚举类型映射到XML元素。
•@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
•@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
三、示例
1、准备工作
Java代码 收藏代码
1. package utils;
2.
3. import java.io.StringReader;
4. import java.io.StringWriter;
5.
6. import javax.xml.bind.JAXBContext;
7. import javax.xml.bind.Marshaller;
8. import javax.xml.bind.Unmarshaller;
9.
10. /**
11. * Jaxb2工具类
12. * @author zhuc
13. * @create 2013-3-29 下午2:40:14
14. */
15. public class JaxbUtil {
16.
17. /**
18. * JavaBean转换成xml
19. * 默认编码UTF-8
20. * @param obj
21. * @param writer
22. * @return
23. */
24. public static String convertToXml(Object obj) {
25. return convertToXml(obj, "UTF-8");
26. }
27.
28. /**
29. * JavaBean转换成xml
30. * @param obj
31. * @param encoding
32. * @return
33. */
34. public static String convertToXml(Object obj, String encoding) {
35. String result = null;
36. try {
37. JAXBContext context = JAXBContext.newInstance(obj.getClass());
38. Marshaller marshaller = context.createMarshaller();
39. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
40. marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
41.
42. StringWriter writer = new StringWriter();
43. marshaller.marshal(obj, writer);
44. result = writer.toString();
45. } catch (Exception e) {
46. e.printStackTrace();
47. }
48.
49. return result;
50. }
51.
52. /**
53. * xml转换成JavaBean
54. * @param xml
55. * @param c
56. * @return
57. */
58. @SuppressWarnings("unchecked")
59. public static <T> T converyToJavaBean(String xml, Class<T> c) {
60. T t = null;
61. try {
62. JAXBContext context = JAXBContext.newInstance(c);
63. Unmarshaller unmarshaller = context.createUnmarshaller();
64. t = (T) unmarshaller.unmarshal(new StringReader(xml));
65. } catch (Exception e) {
66. e.printStackTrace();
67. }
68.
69. return t;
70. }
71. }
非常简单易懂,需要注意的是
Java代码 收藏代码
1. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
2. marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
Marshaller.JAXB_FORMATTED_OUTPUT 决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml)
Marshaller.JAXB_ENCODING xml的编码方式
另外,Marshaller 还有其他Property可以设置,可以去查阅api。
2、最简单转换
Java代码 收藏代码
1. package t1;
2.
3. import java.util.Date;
4.
5. import javax.xml.bind.annotation.XmlAccessType;
6. import javax.xml.bind.annotation.XmlAccessorType;
7. import javax.xml.bind.annotation.XmlAttribute;
8. import javax.xml.bind.annotation.XmlElement;
9. import javax.xml.bind.annotation.XmlRootElement;
10. import javax.xml.bind.annotation.XmlType;
11.
12. /**
13. * @author zhuc
14. * @create 2013-3-29 下午2:49:48
15. */
16. @XmlAccessorType(XmlAccessType.FIELD)
17. @XmlRootElement
18. @XmlType(name = "book", propOrder = { "author", "calendar", "price", "id" })
19. public class Book {
20.
21. @XmlElement(required = true)
22. private String author;
23.
24. @XmlElement(name = "price_1", required = true)
25. private float price;
26.
27. @XmlElement
28. private Date calendar;
29.
30. @XmlAttribute
31. private Integer id;
32.
33. /**
34. * @return the author
35. */
36. public String getAuthor() {
37. return author;
38. }
39.
40. /**
41. * @return the price
42. */
43. public float getPrice() {
44. return price;
45. }
46.
47. /**
48. * @return the calendar
49. */
50. public Date getCalendar() {
51. return calendar;
52. }
53.
54. /**
55. * @return the id
56. */
57. public Integer getId() {
58. return id;
59. }
60.
61. /**
62. * @param author the author to set
63. */
64. public void setAuthor(String author) {
65. this.author = author;
66. }
67.
68. /**
69. * @param price the price to set
70. */
71. public void setPrice(float price) {
72. this.price = price;
73. }
74.
75. /**
76. * @param calendar the calendar to set
77. */
78. public void setCalendar(Date calendar) {
79. this.calendar = calendar;
80. }
81.
82. /**
83. * @param id the id to set
84. */
85. public void setId(Integer id) {
86. this.id = id;
87. }
88.
89. /* (non-Javadoc)
90. * @see java.lang.Object#toString()
91. */
92. @Override
93. public String toString() {
94. return "Book [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]";
95. }
96.
97. }
Java代码 收藏代码
1. package t1;
2.
3. import java.util.Date;
4.
5. import javax.xml.bind.JAXBException;
6.
7. import org.junit.Test;
8.
9. import utils.JaxbUtil;
10.
11. /**
12. * @author zhuc
13. * @create 2013-3-29 下午2:50:00
14. */
15. public class JaxbTest1 {
16.
17. /**
18. * @throws JAXBException
19. */
20. @Test
21. public void showMarshaller() {
22. Book book = new Book();
23. book.setId(100);
24. book.setAuthor("James");
25. book.setCalendar(new Date());
26. book.setPrice(23.45f); //默认是0.0
27.
28. String str = JaxbUtil.convertToXml(book);
29. System.out.println(str);
30. }
31.
32. /**
33. * @throws JAXBException
34. */
35. @Test
36. public void showUnMarshaller() {
37. String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
38. "<book id=\"100\">" +
39. " <author>James</author>" +
40. " <calendar>2013-03-29T09:25:56.004+08:00</calendar>" +
41. " <price_1>23.45</price_1>" +
42. "</book>";
43.
44. Book book = JaxbUtil.converyToJavaBean(str, Book.class);
45. System.out.println(book);
46. }
47. }
输出结果分别为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book id="100">
<author>James</author>
<calendar>2013-03-29T14:50:58.974+08:00</calendar>
<price_1>23.45</price_1>
</book>
Book [author=James, price=23.45, calendar=Fri Mar 29 09:25:56 CST 2013, id=100]
3、类中包含复杂对象的转换
Java代码 收藏代码
1. package t2;
2.
3. import javax.xml.bind.annotation.XmlAccessType;
4. import javax.xml.bind.annotation.XmlAccessorType;
5. import javax.xml.bind.annotation.XmlAttribute;
6. import javax.xml.bind.annotation.XmlElement;
7. import javax.xml.bind.annotation.XmlRootElement;
8. import javax.xml.bind.annotation.XmlType;
9.
10. /**
11. * @author zhuc
12. * @create 2013-3-29 下午2:51:44
13. */
14. @XmlAccessorType(XmlAccessType.FIELD)
15. @XmlRootElement(name = "student")
16. @XmlType(propOrder = {})
17. public class Student {
18.
19. @XmlAttribute
20. private Integer id;
21.
22. @XmlElement
23. private String name;
24.
25. @XmlElement(name = "role")
26. private Role role;
27.
28. /**
29. * @return the id
30. */
31. public Integer getId() {
32. return id;
33. }
34.
35. /**
36. * @return the name
37. */
38. public String getName() {
39. return name;
40. }
41.
42. /**
43. * @return the role
44. */
45. public Role getRole() {
46. return role;
47. }
48.
49. /**
50. * @param id the id to set
51. */
52. public void setId(Integer id) {
53. this.id = id;
54. }
55.
56. /**
57. * @param name the name to set
58. */
59. public void setName(String name) {
60. this.name = name;
61. }
62.
63. /**
64. * @param role the role to set
65. */
66. public void setRole(Role role) {
67. this.role = role;
68. }
69.
70. /* (non-Javadoc)
71. * @see java.lang.Object#toString()
72. */
73. @Override
74. public String toString() {
75. return "Student [id=" + id + ", name=" + name + ", role=" + role + "]";
76. }
77.
78. }
Java代码 收藏代码
1. package t2;
2.
3. import javax.xml.bind.annotation.XmlAccessType;
4. import javax.xml.bind.annotation.XmlAccessorType;
5. import javax.xml.bind.annotation.XmlElement;
6. import javax.xml.bind.annotation.XmlType;
7.
8. /**
9. * @author zhuc
10. * @create 2013-3-29 下午2:51:52
11. */
12. @XmlAccessorType(XmlAccessType.FIELD)
13. @XmlType(propOrder = { "name", "desc" })
14. public class Role {
15.
16. @XmlElement
17. private String name;
18.
19. @XmlElement
20. private String desc;
21.
22. /**
23. * @return the name
24. */
25. public String getName() {
26. return name;
27. }
28.
29. /**
30. * @return the desc
31. */
32. public String getDesc() {
33. return desc;
34. }
35.
36. /**
37. * @param name the name to set
38. */
39. public void setName(String name) {
40. this.name = name;
41. }
42.
43. /**
44. * @param desc the desc to set
45. */
46. public void setDesc(String desc) {
47. this.desc = desc;
48. }
49.
50. /* (non-Javadoc)
51. * @see java.lang.Object#toString()
52. */
53. @Override
54. public String toString() {
55. return "Role [name=" + name + ", desc=" + desc + "]";
56. }
57.
58. }
Java代码 收藏代码
1. package t2;
2.
3. import org.junit.Test;
4.
5. import utils.JaxbUtil;
6.
7. /**
8. * @author zhuc
9. * @create 2013-3-29 下午2:52:00
10. */
11. public class JaxbTest2 {
12.
13. @Test
14. public void showMarshaller() {
15.
16. Student student = new Student();
17. student.setId(12);
18. student.setName("test");
19.
20. Role role = new Role();
21. role.setDesc("管理");
22. role.setName("班长");
23.
24. student.setRole(role);
25.
26. String str = JaxbUtil.convertToXml(student);
27. System.out.println(str);
28. }
29.
30. @Test
31. public void showUnMarshaller() {
32. String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
33. "<student id=\"12\">"+
34. " <name>test</name>"+
35. " <role>"+
36. " <name>班长</name>"+
37. " <desc>管理</desc>"+
38. "</role>"+
39. "</student>";
40. Student student = JaxbUtil.converyToJavaBean(str, Student.class);
41. System.out.println(student);
42. }
43.
44. }
输出结果分别为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<student id="12">
<name>test</name>
<role>
<name>班长</name>
<desc>管理</desc>
</role>
</student>
Student [id=12, name=test, role=Role [name=班长, desc=管理]]
4、集合对象的转换(同样适用于Set)
Java代码 收藏代码
1. package t3;
2.
3. import java.util.List;
4.
5. import javax.xml.bind.annotation.XmlAccessType;
6. import javax.xml.bind.annotation.XmlAccessorType;
7. import javax.xml.bind.annotation.XmlElement;
8. import javax.xml.bind.annotation.XmlElementWrapper;
9. import javax.xml.bind.annotation.XmlRootElement;
10. import javax.xml.bind.annotation.XmlType;
11.
12. /**
13. * @author zhuc
14. * @create 2013-3-29 下午2:55:56
15. */
16. @XmlAccessorType(XmlAccessType.FIELD)
17. @XmlRootElement(name = "country")
18. @XmlType(propOrder = { "name", "provinceList" })
19. public class Country {
20.
21. @XmlElement(name = "country_name")
22. private String name;
23.
24. @XmlElementWrapper(name = "provinces")
25. @XmlElement(name = "province")
26. private List<Province> provinceList;
27.
28. /**
29. * @return the name
30. */
31. public String getName() {
32. return name;
33. }
34.
35. /**
36. * @return the provinceList
37. */
38. public List<Province> getProvinceList() {
39. return provinceList;
40. }
41.
42. /**
43. * @param name the name to set
44. */
45. public void setName(String name) {
46. this.name = name;
47. }
48.
49. /**
50. * @param provinceList the provinceList to set
51. */
52. public void setProvinceList(List<Province> provinceList) {
53. this.provinceList = provinceList;
54. }
55.
56. /* (non-Javadoc)
57. * @see java.lang.Object#toString()
58. */
59. @Override
60. public String toString() {
61. return "Country [name=" + name + ", provinceList=" + provinceList + "]";
62. }
63.
64. }
Java代码 收藏代码
1. package t3;
2.
3. import javax.xml.bind.annotation.XmlAccessType;
4. import javax.xml.bind.annotation.XmlAccessorType;
5. import javax.xml.bind.annotation.XmlElement;
6. import javax.xml.bind.annotation.XmlType;
7.
8. /**
9. * @author zhuc
10. * @create 2013-3-29 下午2:56:03
11. */
12. @XmlAccessorType(XmlAccessType.FIELD)
13. @XmlType(propOrder = { "name", "provCity" })
14. public class Province {
15.
16. @XmlElement(name = "province_name")
17. private String name;
18.
19. @XmlElement(name = "prov_city")
20. private String provCity;
21.
22. /**
23. * @return the provCity
24. */
25. public String getProvCity() {
26. return provCity;
27. }
28.
29. /**
30. * @param provCity the provCity to set
31. */
32. public void setProvCity(String provCity) {
33. this.provCity = provCity;
34. }
35.
36. /**
37. * @return the name
38. */
39. public String getName() {
40. return name;
41. }
42.
43. /**
44. * @param name the name to set
45. */
46. public void setName(String name) {
47. this.name = name;
48. }
49.
50. /* (non-Javadoc)
51. * @see java.lang.Object#toString()
52. */
53. @Override
54. public String toString() {
55. return "Province [name=" + name + ", provCity=" + provCity + "]";
56. }
57.
58. }
Java代码 收藏代码
1. package t3;
2.
3. import java.util.ArrayList;
4. import java.util.List;
5.
6. import org.junit.Test;
7.
8. import utils.JaxbUtil;
9.
10. /**
11. * @author zhuc
12. * @create 2013-3-29 下午2:56:11
13. */
14. public class JaxbTest3 {
15.
16. /**
17. * @throws JAXBException
18. */
19. @Test
20. public void showMarshaller() {
21. Country country = new Country();
22. country.setName("中国");
23.
24. List<Province> list = new ArrayList<Province>();
25. Province province = new Province();
26. province.setName("江苏省");
27. province.setProvCity("南京市");
28. Province province2 = new Province();
29. province2.setName("浙江省");
30. province2.setProvCity("杭州市");
31. list.add(province);
32. list.add(province2);
33.
34. country.setProvinceList(list);
35.
36. String str = JaxbUtil.convertToXml(country);
37. System.out.println(str);
38. }
39.
40. /**
41. *
42. */
43. @Test
44. public void showUnMarshaller() {
45. String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
46. "<country>"+
47. " <country_name>中国</country_name>"+
48. " <provinces>"+
49. " <province>"+
50. " <province_name>江苏省</province_name>"+
51. " <prov_city>南京市</prov_city>"+
52. " </province>"+
53. " <province>"+
54. " <province_name>浙江省</province_name>"+
55. " <prov_city>杭州市</prov_city>"+
56. " </province>"+
57. " </provinces>"+
58. "</country>";
59. Country country = JaxbUtil.converyToJavaBean(str, Country.class);
60. System.out.println(country);
61. }
62.
63. }
输出结果分别为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<country>
<country_name>中国</country_name>
<provinces>
<province>
<province_name>江苏省</province_name>
<prov_city>南京市</prov_city>
</province>
<province>
<province_name>浙江省</province_name>
<prov_city>杭州市</prov_city>
</province>
</provinces>
</country>
Country [name=中国, provinceList=[Province [name=江苏省, provCity=南京市], Province [name=浙江省, provCity=杭州市]]]
一、简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即将转换的JavaBean中添加annotation注解。
二、重要概念
•JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
•Marshaller接口,将Java对象序列化为XML数据。
•Unmarshaller接口,将XML数据反序列化为Java对象。
•@XmlType,将Java类或枚举类型映射到XML模式类型
•@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
•@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
•@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
•@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
•@XmlRootElement,将Java类或枚举类型映射到XML元素。
•@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
•@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
三、示例
1、准备工作
Java代码 收藏代码
1. package utils;
2.
3. import java.io.StringReader;
4. import java.io.StringWriter;
5.
6. import javax.xml.bind.JAXBContext;
7. import javax.xml.bind.Marshaller;
8. import javax.xml.bind.Unmarshaller;
9.
10. /**
11. * Jaxb2工具类
12. * @author zhuc
13. * @create 2013-3-29 下午2:40:14
14. */
15. public class JaxbUtil {
16.
17. /**
18. * JavaBean转换成xml
19. * 默认编码UTF-8
20. * @param obj
21. * @param writer
22. * @return
23. */
24. public static String convertToXml(Object obj) {
25. return convertToXml(obj, "UTF-8");
26. }
27.
28. /**
29. * JavaBean转换成xml
30. * @param obj
31. * @param encoding
32. * @return
33. */
34. public static String convertToXml(Object obj, String encoding) {
35. String result = null;
36. try {
37. JAXBContext context = JAXBContext.newInstance(obj.getClass());
38. Marshaller marshaller = context.createMarshaller();
39. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
40. marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
41.
42. StringWriter writer = new StringWriter();
43. marshaller.marshal(obj, writer);
44. result = writer.toString();
45. } catch (Exception e) {
46. e.printStackTrace();
47. }
48.
49. return result;
50. }
51.
52. /**
53. * xml转换成JavaBean
54. * @param xml
55. * @param c
56. * @return
57. */
58. @SuppressWarnings("unchecked")
59. public static <T> T converyToJavaBean(String xml, Class<T> c) {
60. T t = null;
61. try {
62. JAXBContext context = JAXBContext.newInstance(c);
63. Unmarshaller unmarshaller = context.createUnmarshaller();
64. t = (T) unmarshaller.unmarshal(new StringReader(xml));
65. } catch (Exception e) {
66. e.printStackTrace();
67. }
68.
69. return t;
70. }
71. }
非常简单易懂,需要注意的是
Java代码 收藏代码
1. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
2. marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
Marshaller.JAXB_FORMATTED_OUTPUT 决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml)
Marshaller.JAXB_ENCODING xml的编码方式
另外,Marshaller 还有其他Property可以设置,可以去查阅api。
2、最简单转换
Java代码 收藏代码
1. package t1;
2.
3. import java.util.Date;
4.
5. import javax.xml.bind.annotation.XmlAccessType;
6. import javax.xml.bind.annotation.XmlAccessorType;
7. import javax.xml.bind.annotation.XmlAttribute;
8. import javax.xml.bind.annotation.XmlElement;
9. import javax.xml.bind.annotation.XmlRootElement;
10. import javax.xml.bind.annotation.XmlType;
11.
12. /**
13. * @author zhuc
14. * @create 2013-3-29 下午2:49:48
15. */
16. @XmlAccessorType(XmlAccessType.FIELD)
17. @XmlRootElement
18. @XmlType(name = "book", propOrder = { "author", "calendar", "price", "id" })
19. public class Book {
20.
21. @XmlElement(required = true)
22. private String author;
23.
24. @XmlElement(name = "price_1", required = true)
25. private float price;
26.
27. @XmlElement
28. private Date calendar;
29.
30. @XmlAttribute
31. private Integer id;
32.
33. /**
34. * @return the author
35. */
36. public String getAuthor() {
37. return author;
38. }
39.
40. /**
41. * @return the price
42. */
43. public float getPrice() {
44. return price;
45. }
46.
47. /**
48. * @return the calendar
49. */
50. public Date getCalendar() {
51. return calendar;
52. }
53.
54. /**
55. * @return the id
56. */
57. public Integer getId() {
58. return id;
59. }
60.
61. /**
62. * @param author the author to set
63. */
64. public void setAuthor(String author) {
65. this.author = author;
66. }
67.
68. /**
69. * @param price the price to set
70. */
71. public void setPrice(float price) {
72. this.price = price;
73. }
74.
75. /**
76. * @param calendar the calendar to set
77. */
78. public void setCalendar(Date calendar) {
79. this.calendar = calendar;
80. }
81.
82. /**
83. * @param id the id to set
84. */
85. public void setId(Integer id) {
86. this.id = id;
87. }
88.
89. /* (non-Javadoc)
90. * @see java.lang.Object#toString()
91. */
92. @Override
93. public String toString() {
94. return "Book [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]";
95. }
96.
97. }
Java代码 收藏代码
1. package t1;
2.
3. import java.util.Date;
4.
5. import javax.xml.bind.JAXBException;
6.
7. import org.junit.Test;
8.
9. import utils.JaxbUtil;
10.
11. /**
12. * @author zhuc
13. * @create 2013-3-29 下午2:50:00
14. */
15. public class JaxbTest1 {
16.
17. /**
18. * @throws JAXBException
19. */
20. @Test
21. public void showMarshaller() {
22. Book book = new Book();
23. book.setId(100);
24. book.setAuthor("James");
25. book.setCalendar(new Date());
26. book.setPrice(23.45f); //默认是0.0
27.
28. String str = JaxbUtil.convertToXml(book);
29. System.out.println(str);
30. }
31.
32. /**
33. * @throws JAXBException
34. */
35. @Test
36. public void showUnMarshaller() {
37. String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
38. "<book id=\"100\">" +
39. " <author>James</author>" +
40. " <calendar>2013-03-29T09:25:56.004+08:00</calendar>" +
41. " <price_1>23.45</price_1>" +
42. "</book>";
43.
44. Book book = JaxbUtil.converyToJavaBean(str, Book.class);
45. System.out.println(book);
46. }
47. }
输出结果分别为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book id="100">
<author>James</author>
<calendar>2013-03-29T14:50:58.974+08:00</calendar>
<price_1>23.45</price_1>
</book>
Book [author=James, price=23.45, calendar=Fri Mar 29 09:25:56 CST 2013, id=100]
3、类中包含复杂对象的转换
Java代码 收藏代码
1. package t2;
2.
3. import javax.xml.bind.annotation.XmlAccessType;
4. import javax.xml.bind.annotation.XmlAccessorType;
5. import javax.xml.bind.annotation.XmlAttribute;
6. import javax.xml.bind.annotation.XmlElement;
7. import javax.xml.bind.annotation.XmlRootElement;
8. import javax.xml.bind.annotation.XmlType;
9.
10. /**
11. * @author zhuc
12. * @create 2013-3-29 下午2:51:44
13. */
14. @XmlAccessorType(XmlAccessType.FIELD)
15. @XmlRootElement(name = "student")
16. @XmlType(propOrder = {})
17. public class Student {
18.
19. @XmlAttribute
20. private Integer id;
21.
22. @XmlElement
23. private String name;
24.
25. @XmlElement(name = "role")
26. private Role role;
27.
28. /**
29. * @return the id
30. */
31. public Integer getId() {
32. return id;
33. }
34.
35. /**
36. * @return the name
37. */
38. public String getName() {
39. return name;
40. }
41.
42. /**
43. * @return the role
44. */
45. public Role getRole() {
46. return role;
47. }
48.
49. /**
50. * @param id the id to set
51. */
52. public void setId(Integer id) {
53. this.id = id;
54. }
55.
56. /**
57. * @param name the name to set
58. */
59. public void setName(String name) {
60. this.name = name;
61. }
62.
63. /**
64. * @param role the role to set
65. */
66. public void setRole(Role role) {
67. this.role = role;
68. }
69.
70. /* (non-Javadoc)
71. * @see java.lang.Object#toString()
72. */
73. @Override
74. public String toString() {
75. return "Student [id=" + id + ", name=" + name + ", role=" + role + "]";
76. }
77.
78. }
Java代码 收藏代码
1. package t2;
2.
3. import javax.xml.bind.annotation.XmlAccessType;
4. import javax.xml.bind.annotation.XmlAccessorType;
5. import javax.xml.bind.annotation.XmlElement;
6. import javax.xml.bind.annotation.XmlType;
7.
8. /**
9. * @author zhuc
10. * @create 2013-3-29 下午2:51:52
11. */
12. @XmlAccessorType(XmlAccessType.FIELD)
13. @XmlType(propOrder = { "name", "desc" })
14. public class Role {
15.
16. @XmlElement
17. private String name;
18.
19. @XmlElement
20. private String desc;
21.
22. /**
23. * @return the name
24. */
25. public String getName() {
26. return name;
27. }
28.
29. /**
30. * @return the desc
31. */
32. public String getDesc() {
33. return desc;
34. }
35.
36. /**
37. * @param name the name to set
38. */
39. public void setName(String name) {
40. this.name = name;
41. }
42.
43. /**
44. * @param desc the desc to set
45. */
46. public void setDesc(String desc) {
47. this.desc = desc;
48. }
49.
50. /* (non-Javadoc)
51. * @see java.lang.Object#toString()
52. */
53. @Override
54. public String toString() {
55. return "Role [name=" + name + ", desc=" + desc + "]";
56. }
57.
58. }
Java代码 收藏代码
1. package t2;
2.
3. import org.junit.Test;
4.
5. import utils.JaxbUtil;
6.
7. /**
8. * @author zhuc
9. * @create 2013-3-29 下午2:52:00
10. */
11. public class JaxbTest2 {
12.
13. @Test
14. public void showMarshaller() {
15.
16. Student student = new Student();
17. student.setId(12);
18. student.setName("test");
19.
20. Role role = new Role();
21. role.setDesc("管理");
22. role.setName("班长");
23.
24. student.setRole(role);
25.
26. String str = JaxbUtil.convertToXml(student);
27. System.out.println(str);
28. }
29.
30. @Test
31. public void showUnMarshaller() {
32. String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
33. "<student id=\"12\">"+
34. " <name>test</name>"+
35. " <role>"+
36. " <name>班长</name>"+
37. " <desc>管理</desc>"+
38. "</role>"+
39. "</student>";
40. Student student = JaxbUtil.converyToJavaBean(str, Student.class);
41. System.out.println(student);
42. }
43.
44. }
输出结果分别为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<student id="12">
<name>test</name>
<role>
<name>班长</name>
<desc>管理</desc>
</role>
</student>
Student [id=12, name=test, role=Role [name=班长, desc=管理]]
4、集合对象的转换(同样适用于Set)
Java代码 收藏代码
1. package t3;
2.
3. import java.util.List;
4.
5. import javax.xml.bind.annotation.XmlAccessType;
6. import javax.xml.bind.annotation.XmlAccessorType;
7. import javax.xml.bind.annotation.XmlElement;
8. import javax.xml.bind.annotation.XmlElementWrapper;
9. import javax.xml.bind.annotation.XmlRootElement;
10. import javax.xml.bind.annotation.XmlType;
11.
12. /**
13. * @author zhuc
14. * @create 2013-3-29 下午2:55:56
15. */
16. @XmlAccessorType(XmlAccessType.FIELD)
17. @XmlRootElement(name = "country")
18. @XmlType(propOrder = { "name", "provinceList" })
19. public class Country {
20.
21. @XmlElement(name = "country_name")
22. private String name;
23.
24. @XmlElementWrapper(name = "provinces")
25. @XmlElement(name = "province")
26. private List<Province> provinceList;
27.
28. /**
29. * @return the name
30. */
31. public String getName() {
32. return name;
33. }
34.
35. /**
36. * @return the provinceList
37. */
38. public List<Province> getProvinceList() {
39. return provinceList;
40. }
41.
42. /**
43. * @param name the name to set
44. */
45. public void setName(String name) {
46. this.name = name;
47. }
48.
49. /**
50. * @param provinceList the provinceList to set
51. */
52. public void setProvinceList(List<Province> provinceList) {
53. this.provinceList = provinceList;
54. }
55.
56. /* (non-Javadoc)
57. * @see java.lang.Object#toString()
58. */
59. @Override
60. public String toString() {
61. return "Country [name=" + name + ", provinceList=" + provinceList + "]";
62. }
63.
64. }
Java代码 收藏代码
1. package t3;
2.
3. import javax.xml.bind.annotation.XmlAccessType;
4. import javax.xml.bind.annotation.XmlAccessorType;
5. import javax.xml.bind.annotation.XmlElement;
6. import javax.xml.bind.annotation.XmlType;
7.
8. /**
9. * @author zhuc
10. * @create 2013-3-29 下午2:56:03
11. */
12. @XmlAccessorType(XmlAccessType.FIELD)
13. @XmlType(propOrder = { "name", "provCity" })
14. public class Province {
15.
16. @XmlElement(name = "province_name")
17. private String name;
18.
19. @XmlElement(name = "prov_city")
20. private String provCity;
21.
22. /**
23. * @return the provCity
24. */
25. public String getProvCity() {
26. return provCity;
27. }
28.
29. /**
30. * @param provCity the provCity to set
31. */
32. public void setProvCity(String provCity) {
33. this.provCity = provCity;
34. }
35.
36. /**
37. * @return the name
38. */
39. public String getName() {
40. return name;
41. }
42.
43. /**
44. * @param name the name to set
45. */
46. public void setName(String name) {
47. this.name = name;
48. }
49.
50. /* (non-Javadoc)
51. * @see java.lang.Object#toString()
52. */
53. @Override
54. public String toString() {
55. return "Province [name=" + name + ", provCity=" + provCity + "]";
56. }
57.
58. }
Java代码 收藏代码
1. package t3;
2.
3. import java.util.ArrayList;
4. import java.util.List;
5.
6. import org.junit.Test;
7.
8. import utils.JaxbUtil;
9.
10. /**
11. * @author zhuc
12. * @create 2013-3-29 下午2:56:11
13. */
14. public class JaxbTest3 {
15.
16. /**
17. * @throws JAXBException
18. */
19. @Test
20. public void showMarshaller() {
21. Country country = new Country();
22. country.setName("中国");
23.
24. List<Province> list = new ArrayList<Province>();
25. Province province = new Province();
26. province.setName("江苏省");
27. province.setProvCity("南京市");
28. Province province2 = new Province();
29. province2.setName("浙江省");
30. province2.setProvCity("杭州市");
31. list.add(province);
32. list.add(province2);
33.
34. country.setProvinceList(list);
35.
36. String str = JaxbUtil.convertToXml(country);
37. System.out.println(str);
38. }
39.
40. /**
41. *
42. */
43. @Test
44. public void showUnMarshaller() {
45. String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
46. "<country>"+
47. " <country_name>中国</country_name>"+
48. " <provinces>"+
49. " <province>"+
50. " <province_name>江苏省</province_name>"+
51. " <prov_city>南京市</prov_city>"+
52. " </province>"+
53. " <province>"+
54. " <province_name>浙江省</province_name>"+
55. " <prov_city>杭州市</prov_city>"+
56. " </province>"+
57. " </provinces>"+
58. "</country>";
59. Country country = JaxbUtil.converyToJavaBean(str, Country.class);
60. System.out.println(country);
61. }
62.
63. }
输出结果分别为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<country>
<country_name>中国</country_name>
<provinces>
<province>
<province_name>江苏省</province_name>
<prov_city>南京市</prov_city>
</province>
<province>
<province_name>浙江省</province_name>
<prov_city>杭州市</prov_city>
</province>
</provinces>
</country>
Country [name=中国, provinceList=[Province [name=江苏省, provCity=南京市], Province [name=浙江省, provCity=杭州市]]]
相关推荐
7. **示例应用**:在`shop`目录中可能包含了一个示例应用,该应用演示了如何使用JAXB生成XML文件。通常,这个示例可能会定义一些带有JAXB注解的Java类,然后创建`JAXBContext`实例,生成`Marshaller`,最后将Java...
**使用JAXB根据XSD生成XML文档** ...这个过程包括创建XSD文件、生成Java类、配置JAXB绑定、创建和填充Java对象,最后使用`Marshaller`生成XML文档。了解并熟练掌握这一流程,能够极大地提高XML处理的效率和准确性。
2. 序列化XML:使用`Marshaller`接口将Java对象转换为XML文档。例如: ```java JAXBContext jaxbContext = JAXBContext.newInstance(User.class); Marshaller marshaller = jaxbContext.createMarshaller(); ...
除了注解方式,JAXB还支持使用XML Schema(XSD)文件生成Java类。通过`xjc`工具,可以将XSD转换为Java源代码,这使得模型和XML结构更加清晰地分离。 JAXB的另一个重要特性是它支持XML绑定的定制,包括命名空间处理...
// 设置输出格式化 Person person = new Person(); person.setName("John Doe"); person.setAge(30); // 将Java对象转换为XML字符串 String xmlString = marshalToString(person, marshaller); System.out....
3. **序列化(Marshalling)**:相反,当需要将Java对象转换为XML文档时,JAXB使用Marshaller接口将Java对象转换为XML格式。这个过程是将Java对象"序列化"为XML字符串或写入XML文件。 **使用JAXB的关键步骤:** 1....
如果不希望手动添加注解,可以使用JAXB的绑定工具(如`xjc`)从XML Schema (XSD)文件生成对应的Java类。这一步骤将创建带有正确注解的Java类,以便JAXB理解XML结构。 (3) **实例化Java对象** 创建Java对象并填充...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在处理结构化数据时。在Java中,有多种方法可以解析XML,其中StAX(Streaming API for XML)和JAXB(Java Architecture for XML ...
在处理XML数据时,JAXB提供了一种方便的方式,让我们可以将XML数据解析为Java对象,也可以将Java对象序列化为XML格式。本话题我们将深入探讨如何使用JAXB将XML转换为Map。 XML是一种结构化数据表示方式,广泛用于...
- 使用第三方库:如Apache的`XMLUtils`或`jaxb2-pretty-printer`等,它们提供了方便的API来格式化XML。 3. **Formatter.java示例** 假设我们有一个名为“Formatter.java”的文件,它可能包含以下代码,用于将未...
当我们有一个Java对象,并希望将其转换成XML格式时,JAXB会使用已有的Java类和XML Schema信息来生成符合Schema规范的XML文档。这个过程可以通过调用`JAXBContext`的`createMarshaller()`方法创建一个marshaller对象...
// 设置输出格式化 marshaller.marshal(person, System.out); // 输出到控制台 marshaller.marshal(person, new File("output.xml")); // 输出到文件 } } ``` 在这个例子中,`Person`是我们的Java类,它被JAXB...
- **XML格式化**:JAXB可以自动处理XML的格式化输出,使得XML文档更易读。 - **灵活性**:JAXB允许自定义XML与Java对象之间的映射,以适应特定需求。 ### 注意事项 - 不是所有Java对象都适合用JAXB,过于复杂的...
3. **配置文件**:对于以XML格式存储的配置文件,JAXB可以使配置加载和保存变得更加简单,而XMLSPY则提供了可视化的编辑和检查。 4. **XML文档处理**:在需要大量处理XML文档的场景下,XMLSPY的高效编辑和验证功能...
有了XSD文件,开发者可以使用Java API如JAXB(Java Architecture for XML Binding)来自动将XML映射为Java对象,简化数据处理。JAXB允许我们根据XSD文件自动生成Java类,这样在解析XML时,可以直接将XML元素转化为...
在实际开发中,结合使用JAXB2和其他XML处理技术,如XPath或StAX,可以实现更复杂的XML操作。对于大型项目,还可以考虑使用更高级的框架如Spring-WS或Apache CXF,它们内置了对JAXB的支持,进一步简化了XML处理的复杂...
// 设置格式化的XML输出 Person person = new Person(); person.setFirstName("John"); person.setLastName("Doe"); // 将对象写入XML文件 marshaller.marshal(person, new File("person.xml")); // 或者写入...
JAXB提供了一种方便、高效的方式,使得开发者能够轻松地在XML格式的数据和Java对象之间进行序列化和反序列化。在Java EE和Java SE环境中,JAXB是一个重要的组件,它简化了XML处理,特别是在处理复杂XML结构时。 ...
@XmlJavaTypeAdapter 注解用于转换比较复杂的对象时,如 map 类型或者格式化日期。 例如: ```java @XmlJavaTypeAdapter(value = DateAdapter.class) private Date date; ``` JAXB 的注解 plays a crucial role in ...