使用JAXB实现JAVA对象和XML字符串的互相转换实例

本贴最后更新于 2967 天前,其中的信息可能已经时移俗易

测试类:

[java] view plain copy
 
  1. package com.yanek.test;  
  2.   
  3.   
  4.   
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import com.yanek.test.JaxbUtil.CollectionWrapper;  
  9.   
  10.   
  11. public class Test {  
  12.   
  13.     /** 
  14.      * @param args 
  15.      */  
  16.     public static void main(String[] args) {  
  17.   
  18.         //创建java对象  
  19.           
  20.         Hotel hotel=new Hotel();  
  21.         hotel.setId(1);  
  22.         hotel.setName("name1");  
  23.   
  24.         RoomTypeVO t1=new RoomTypeVO();  
  25.         t1.setPrice("20");  
  26.         t1.setTypeid(1);  
  27.         t1.setTypename("typename1");  
  28.           
  29.         RoomTypeVO t2=new RoomTypeVO();  
  30.         t2.setPrice("30");  
  31.         t2.setTypeid(2);  
  32.         t2.setTypename("typename2");  
  33.           
  34.   
  35.         List<RoomTypeVO> RoomTypeVOs=new ArrayList<RoomTypeVO>();  
  36.         RoomTypeVOs.add(t1);  
  37.         RoomTypeVOs.add(t2);  
  38.         hotel.setRoomTypeVOs(RoomTypeVOs);  
  39.   
  40.           
  41.         //将java对象转换为XML字符串  
  42.         JaxbUtil requestBinder = new JaxbUtil(Hotel.class,  
  43.                 CollectionWrapper.class);  
  44.         String retXml = requestBinder.toXml(hotel, "utf-8");  
  45.         System.out.println("xml:"+retXml);  
  46.           
  47.         //将xml字符串转换为java对象  
  48.         JaxbUtil resultBinder = new JaxbUtil(Hotel.class,  
  49.                 CollectionWrapper.class);  
  50.         Hotel hotelObj = resultBinder.fromXml(retXml);  
  51.           
  52.           
  53.           
  54.         System.out.println("hotelid:"+hotelObj.getId());  
  55.         System.out.println("hotelname:"+hotelObj.getName());  
  56.         for(RoomTypeVO roomTypeVO:hotelObj.getRoomTypeVOs())  
  57.         {  
  58.             System.out.println("Typeid:"+roomTypeVO.getTypeid());  
  59.             System.out.println("Typename:"+roomTypeVO.getTypename());  
  60.         }  
  61.   
  62.           
  63.     }  
  64.   
  65. }  

 

输出如下:

 

[html] view plain copy
 
  1. xml:<?xml version="1.0" encoding="utf-8" standalone="yes"?>  
  2. <hotel id="1">  
  3.     <name>name1</name>  
  4.     <RoomTypeVOs>  
  5.         <RoomTypeVO typeid="1">  
  6.             <price>20</price>  
  7.             <typename>typename1</typename>  
  8.         </RoomTypeVO>  
  9.         <RoomTypeVO typeid="2">  
  10.             <price>30</price>  
  11.             <typename>typename2</typename>  
  12.         </RoomTypeVO>  
  13.     </RoomTypeVOs>  
  14. </hotel>  
  15.   
  16.   
  17. hotelid:1  
  18. hotelname:name1  
  19. Typeid:1  
  20. Typename:typename1  
  21. Typeid:2  
  22. Typename:typename2  

 

 

 

相关类:

 

[java] view plain copy
 
  1. package com.yanek.test;  
  2.   
  3.   
  4.   
  5. import java.util.List;  
  6.   
  7. import javax.xml.bind.annotation.XmlAttribute;  
  8. import javax.xml.bind.annotation.XmlElement;  
  9. import javax.xml.bind.annotation.XmlElementWrapper;  
  10. import javax.xml.bind.annotation.XmlRootElement;  
  11.   
  12. @XmlRootElement(name = "hotel")  
  13. public class Hotel {  
  14.     @XmlElementWrapper(name = "RoomTypeVOs")  
  15.     @XmlElement(name = "RoomTypeVO")  
  16.     public List<RoomTypeVO> getRoomTypeVOs() {  
  17.         return RoomTypeVOs;  
  18.     }  
  19.     public void setRoomTypeVOs(List<RoomTypeVO> roomTypeVOs) {  
  20.         RoomTypeVOs = roomTypeVOs;  
  21.     }  
  22.     private List<RoomTypeVO> RoomTypeVOs;  
  23.       
  24.     /////@XmlElement(name = "id")  
  25.     @XmlAttribute(name = "id")  
  26.     public int getId() {  
  27.         return id;  
  28.     }  
  29.     public void setId(int id) {  
  30.         this.id = id;  
  31.     }  
  32.     @XmlElement(name = "name")  
  33.     public String getName() {  
  34.         return name;  
  35.     }  
  36.     public void setName(String name) {  
  37.         this.name = name;  
  38.     }  
  39.     private int id;  
  40.     private String name;  
  41.       
  42.   
  43. }  
  44.   
  45.   
  46.   
  47. package com.yanek.test;  
  48.   
  49. import javax.xml.bind.annotation.XmlAttribute;  
  50. import javax.xml.bind.annotation.XmlElement;  
  51.   
  52. public class RoomTypeVO {  
  53.       
  54.     ///@XmlElement(name = "typeid")  
  55.     @XmlAttribute(name = "typeid")  
  56.     public int getTypeid() {  
  57.         return typeid;  
  58.     }  
  59.     public void setTypeid(int typeid) {  
  60.         this.typeid = typeid;  
  61.     }  
  62.     @XmlElement(name = "typename")  
  63.     public String getTypename() {  
  64.         return typename;  
  65.     }  
  66.     public void setTypename(String typename) {  
  67.         this.typename = typename;  
  68.     }  
  69.     @XmlElement(name = "price")  
  70.     public String getPrice() {  
  71.         return price;  
  72.     }  
  73.     public void setPrice(String price) {  
  74.         this.price = price;  
  75.     }  
  76.     private int typeid;  
  77.     private String typename;  
  78.     private String price;  
  79.   
  80. }  

 

 

 

jaxb简单工具类:

 

[java] view plain copy
 
  1. package com.yanek.test;  
  2.   
  3. import java.io.StringReader;  
  4. import java.io.StringWriter;  
  5. import java.util.Collection;  
  6.   
  7. import javax.xml.bind.JAXBContext;  
  8. import javax.xml.bind.JAXBElement;  
  9. import javax.xml.bind.JAXBException;  
  10. import javax.xml.bind.Marshaller;  
  11. import javax.xml.bind.Unmarshaller;  
  12. import javax.xml.bind.annotation.XmlAnyElement;  
  13. import javax.xml.namespace.QName;  
  14.   
  15. import org.apache.commons.lang.StringUtils;  
  16.   
  17. /** 
  18.  * 使用Jaxb2.0实现XML<->Java Object的Binder. 
  19.  *  
  20.  * 特别支持Root对象是List的情形. 
  21.  *  
  22.  * @author 
  23.  */  
  24. public class JaxbUtil {  
  25.     // 多线程安全的Context.  
  26.     private JAXBContext jaxbContext;  
  27.   
  28.     /** 
  29.      * @param types 
  30.      *            所有需要序列化的Root对象的类型. 
  31.      */  
  32.     public JaxbUtil(Class<?>... types) {  
  33.         try {  
  34.             jaxbContext = JAXBContext.newInstance(types);  
  35.         } catch (JAXBException e) {  
  36.             throw new RuntimeException(e);  
  37.         }  
  38.     }  
  39.   
  40.     /** 
  41.      * Java Object->Xml. 
  42.      */  
  43.     public String toXml(Object root, String encoding) {  
  44.         try {  
  45.             StringWriter writer = new StringWriter();  
  46.             createMarshaller(encoding).marshal(root, writer);  
  47.             return writer.toString();  
  48.         } catch (JAXBException e) {  
  49.             throw new RuntimeException(e);  
  50.         }  
  51.     }  
  52.   
  53.     /** 
  54.      * Java Object->Xml, 特别支持对Root Element是Collection的情形. 
  55.      */  
  56.     @SuppressWarnings("unchecked")  
  57.     public String toXml(Collection root, String rootName, String encoding) {  
  58.         try {  
  59.             CollectionWrapper wrapper = new CollectionWrapper();  
  60.             wrapper.collection = root;  
  61.   
  62.             JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(  
  63.                     new QName(rootName), CollectionWrapper.class, wrapper);  
  64.   
  65.             StringWriter writer = new StringWriter();  
  66.             createMarshaller(encoding).marshal(wrapperElement, writer);  
  67.   
  68.             return writer.toString();  
  69.         } catch (JAXBException e) {  
  70.             throw new RuntimeException(e);  
  71.         }  
  72.     }  
  73.   
  74.     /** 
  75.      * Xml->Java Object. 
  76.      */  
  77.     @SuppressWarnings("unchecked")  
  78.     public <T> T fromXml(String xml) {  
  79.         try {  
  80.             StringReader reader = new StringReader(xml);  
  81.             return (T) createUnmarshaller().unmarshal(reader);  
  82.         } catch (JAXBException e) {  
  83.             throw new RuntimeException(e);  
  84.         }  
  85.     }  
  86.   
  87.     /** 
  88.      * Xml->Java Object, 支持大小写敏感或不敏感. 
  89.      */  
  90.     @SuppressWarnings("unchecked")  
  91.     public <T> T fromXml(String xml, boolean caseSensitive) {  
  92.         try {  
  93.             String fromXml = xml;  
  94.             if (!caseSensitive)  
  95.                 fromXml = xml.toLowerCase();  
  96.             StringReader reader = new StringReader(fromXml);  
  97.             return (T) createUnmarshaller().unmarshal(reader);  
  98.         } catch (JAXBException e) {  
  99.             throw new RuntimeException(e);  
  100.         }  
  101.     }  
  102.   
  103.     /** 
  104.      * 创建Marshaller, 设定encoding(可为Null). 
  105.      */  
  106.     public Marshaller createMarshaller(String encoding) {  
  107.         try {  
  108.             Marshaller marshaller = jaxbContext.createMarshaller();  
  109.   
  110.             marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);  
  111.   
  112.             if (StringUtils.isNotBlank(encoding)) {  
  113.                 marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
  114.             }  
  115.             return marshaller;  
  116.         } catch (JAXBException e) {  
  117.             throw new RuntimeException(e);  
  118.         }  
  119.     }  
  120.   
  121.     /** 
  122.      * 创建UnMarshaller. 
  123.      */  
  124.     public Unmarshaller createUnmarshaller() {  
  125.         try {  
  126.             return jaxbContext.createUnmarshaller();  
  127.         } catch (JAXBException e) {  
  128.             throw new RuntimeException(e);  
  129.         }  
  130.     }  
  131.   
  132.     /** 
  133.      * 封装Root Element 是 Collection的情况. 
  134.      */  
  135.     public static class CollectionWrapper {  
  136.         @SuppressWarnings("unchecked")  
  137.         @XmlAnyElement  
  138.         protected Collection collection;  
  139.     }  
  140. }  
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 2 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    130 引用 • 793 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    262 引用 • 664 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 7 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 606 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 609 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 53 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    5 引用 • 62 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 430 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    143 引用 • 3752 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 566 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 61 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 474 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 1 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 403 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 609 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 714 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 5 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 2 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    20156 引用 • 77717 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 632 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 441 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 88 回帖