JAXB2序列化XML

时间:2022-12-14 12:09:43

Jaxb2 实现JavaBean与xml互转 http://zhuchengzzcc.iteye.com/blog/1838702

  • 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、

 package utils;

 import java.io.StringReader;
 import java.io.StringWriter;

 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;

 /**
  * Jaxb2工具类
  * @author        zhuc
  * @create        2013-3-29 下午2:40:14
  */
 public class JaxbUtil {

     /**
      * JavaBean转换成xml
      * 默认编码UTF-8
      * @param obj
      * @param writer
      * @return
      */
     public static String convertToXml(Object obj) {
         return convertToXml(obj, "UTF-8");
     }

     /**
      * JavaBean转换成xml
      * @param obj
      * @param encoding
      * @return
      */
     public static String convertToXml(Object obj, String encoding) {
         String result = null;
         try {
             JAXBContext context = JAXBContext.newInstance(obj.getClass());
             Marshaller marshaller = context.createMarshaller();
             marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
             marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

             StringWriter writer = new StringWriter();
             marshaller.marshal(obj, writer);
             result = writer.toString();
         } catch (Exception e) {
             e.printStackTrace();
         }

         return result;
     }

     /**
      * xml转换成JavaBean
      * @param xml
      * @param c
      * @return
      */
     @SuppressWarnings("unchecked")
     public static <T> T converyToJavaBean(String xml, Class<T> c) {
         T t = null;
         try {
             JAXBContext context = JAXBContext.newInstance(c);
             Unmarshaller unmarshaller = context.createUnmarshaller();
             t = (T) unmarshaller.unmarshal(new StringReader(xml));
         } catch (Exception e) {
             e.printStackTrace();
         }

         return t;
     }
 }

2、简单转换

 package t1;

 import java.util.Date;

 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:49:48
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlRootElement
 @XmlType(name = "book", propOrder = { "author", "calendar", "price", "id" })
 public class Book {

     @XmlElement(required = true)
     private String author;

     @XmlElement(name = "price_1", required = true)
     private float price;

     @XmlElement
     private Date calendar;

     @XmlAttribute
     private Integer id;

     /**
      * @return the author
      */
     public String getAuthor() {
         return author;
     }

     /**
      * @return the price
      */
     public float getPrice() {
         return price;
     }

     /**
      * @return the calendar
      */
     public Date getCalendar() {
         return calendar;
     }

     /**
      * @return the id
      */
     public Integer getId() {
         return id;
     }

     /**
      * @param author the author to set
      */
     public void setAuthor(String author) {
         this.author = author;
     }

     /**
      * @param price the price to set
      */
     public void setPrice(float price) {
         this.price = price;
     }

     /**
      * @param calendar the calendar to set
      */
     public void setCalendar(Date calendar) {
         this.calendar = calendar;
     }

     /**
      * @param id the id to set
      */
     public void setId(Integer id) {
         this.id = id;
     }

     /* (non-Javadoc)
      * @see java.lang.Object#toString()
      */
     @Override
     public String toString() {
         return "Book [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]";
     }

 }
 package t1;

 import java.util.Date;

 import javax.xml.bind.JAXBException;

 import org.junit.Test;

 import utils.JaxbUtil;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:50:00
  */
 public class JaxbTest1 {

     /**
      * @throws JAXBException
      */
     @Test
     public void showMarshaller()  {
         Book book = new Book();
         book.setId(100);
         book.setAuthor("James");
         book.setCalendar(new Date());
         book.setPrice(23.45f);     //默认是0.0

         String str = JaxbUtil.convertToXml(book);
         System.out.println(str);
     }

     /**
      * @throws JAXBException
      */
     @Test
     public void showUnMarshaller() {
         String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
             "<book id=\"100\">" +
             "    <author>James</author>" +
              "   <calendar>2013-03-29T09:25:56.004+08:00</calendar>" +
               "  <price_1>23.45</price_1>" +
             "</book>";

         Book book = JaxbUtil.converyToJavaBean(str, Book.class);
         System.out.println(book);
     }
 }

3、类中包含复杂对象的转换

 package t2;

 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:51:44
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlRootElement(name = "student")
 @XmlType(propOrder = {})
 public class Student {

     @XmlAttribute
     private Integer id;

     @XmlElement
     private String name;

     @XmlElement(name = "role")
     private Role role;

     /**
      * @return the id
      */
     public Integer getId() {
         return id;
     }

     /**
      * @return the name
      */
     public String getName() {
         return name;
     }

     /**
      * @return the role
      */
     public Role getRole() {
         return role;
     }

     /**
      * @param id the id to set
      */
     public void setId(Integer id) {
         this.id = id;
     }

     /**
      * @param name the name to set
      */
     public void setName(String name) {
         this.name = name;
     }

     /**
      * @param role the role to set
      */
     public void setRole(Role role) {
         this.role = role;
     }

     /* (non-Javadoc)
      * @see java.lang.Object#toString()
      */
     @Override
     public String toString() {
         return "Student [id=" + id + ", name=" + name + ", role=" + role + "]";
     }

 }
 package t2;

 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:51:52
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(propOrder = { "name", "desc" })
 public class Role {

     @XmlElement
     private String name;

     @XmlElement
     private String desc;

     /**
      * @return the name
      */
     public String getName() {
         return name;
     }

     /**
      * @return the desc
      */
     public String getDesc() {
         return desc;
     }

     /**
      * @param name the name to set
      */
     public void setName(String name) {
         this.name = name;
     }

     /**
      * @param desc the desc to set
      */
     public void setDesc(String desc) {
         this.desc = desc;
     }

     /* (non-Javadoc)
      * @see java.lang.Object#toString()
      */
     @Override
     public String toString() {
         return "Role [name=" + name + ", desc=" + desc + "]";
     }

 }
 package t2;

 import org.junit.Test;

 import utils.JaxbUtil;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:52:00
  */
 public class JaxbTest2 {

     @Test
     public void showMarshaller() {

         Student student = new Student();
         student.setId(12);
         student.setName("test");

         Role role = new Role();
         role.setDesc("管理");
         role.setName("班长");

         student.setRole(role);

         String str = JaxbUtil.convertToXml(student);
         System.out.println(str);
     }

     @Test
     public void showUnMarshaller() {
         String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
             "<student id=\"12\">"+
             "    <name>test</name>"+
              "   <role>"+
               "      <name>班长</name>"+
                "     <desc>管理</desc>"+
                 "</role>"+
             "</student>";
         Student student = JaxbUtil.converyToJavaBean(str, Student.class);
         System.out.println(student);
     }

 }

4、集合对象的转换

 package t3;

 import java.util.List;

 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:55:56
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlRootElement(name = "country")
 @XmlType(propOrder = { "name", "provinceList" })
 public class Country {

     @XmlElement(name = "country_name")
     private String name;

     @XmlElementWrapper(name = "provinces")
     @XmlElement(name = "province")
     private List<Province> provinceList;

     /**
      * @return the name
      */
     public String getName() {
         return name;
     }

     /**
      * @return the provinceList
      */
     public List<Province> getProvinceList() {
         return provinceList;
     }

     /**
      * @param name the name to set
      */
     public void setName(String name) {
         this.name = name;
     }

     /**
      * @param provinceList the provinceList to set
      */
     public void setProvinceList(List<Province> provinceList) {
         this.provinceList = provinceList;
     }

     /* (non-Javadoc)
      * @see java.lang.Object#toString()
      */
     @Override
     public String toString() {
         return "Country [name=" + name + ", provinceList=" + provinceList + "]";
     }

 }
 package t3;

 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:56:03
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(propOrder = { "name", "provCity" })
 public class Province {

     @XmlElement(name = "province_name")
     private String name;

     @XmlElement(name = "prov_city")
     private String provCity;

     /**
      * @return the provCity
      */
     public String getProvCity() {
         return provCity;
     }

     /**
      * @param provCity the provCity to set
      */
     public void setProvCity(String provCity) {
         this.provCity = provCity;
     }

     /**
      * @return the name
      */
     public String getName() {
         return name;
     }

     /**
      * @param name the name to set
      */
     public void setName(String name) {
         this.name = name;
     }

     /* (non-Javadoc)
      * @see java.lang.Object#toString()
      */
     @Override
     public String toString() {
         return "Province [name=" + name + ", provCity=" + provCity + "]";
     }

 }
 package t3;

 import java.util.ArrayList;
 import java.util.List;

 import org.junit.Test;

 import utils.JaxbUtil;

 /**
  * @author        zhuc
  * @create        2013-3-29 下午2:56:11
  */
 public class JaxbTest3 {

     /**
      * @throws JAXBException
      */
     @Test
     public void showMarshaller() {
         Country country = new Country();
         country.setName("中国");

         List<Province> list = new ArrayList<Province>();
         Province province = new Province();
         province.setName("江苏省");
         province.setProvCity("南京市");
         Province province2 = new Province();
         province2.setName("浙江省");
         province2.setProvCity("杭州市");
         list.add(province);
         list.add(province2);

         country.setProvinceList(list);

         String str = JaxbUtil.convertToXml(country);
         System.out.println(str);
     }

     /**
      *
      */
     @Test
     public void showUnMarshaller() {
         String str = "<?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 country = JaxbUtil.converyToJavaBean(str, Country.class);
         System.out.println(country);
     }

 }

JAXB2序列化XML的更多相关文章

  1. 对象序列化XML

    /// <summary>/// 对象序列化XML/// </summary>/// <param name="type">类型</par ...

  2. WCF中序列化&lpar;XML&bsol;JSON&bsol;Dt&rpar;

    序列化 是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象. 序列化描述了持久化 ...

  3. C&num; 对象 序列化 XML

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  4. C&num;&period;NET序列化XML、JSON、二进制微软自带DLL与newtonsoft&lpar;json&period;net&rpar;

    序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推 ...

  5. SharePreference是如何实现的——序列化XML文件

    还记得上一篇我们讲到了用SharePreference来存储数据,那么究竟它是如何实现的呢,今天我们就来仔细看看其实现的细节,我们给它一个准确的名字,叫做XML序列化器(XmlSerializer). ...

  6. C&num; 序列化xml

    把一个类序列化成xml,显示在txtarea,然后在获取txtarea的值进行反序列化成类,因为一个字段的值是url形式的,url里面有这个符号:&,所以反序列化的时候报错了,查了好久才发现是 ...

  7. 反序列化和序列化xml使用反射处理节点的属性

    当一个xml中有大量的属性XmlAttribute需要序列化和反序列化,通常需要复制粘贴大量的如下代码,显得很丑陋,而且容易出错: XmlAttribute attr = Doc.CreateAttr ...

  8. C&num;序列化xml&comma;开发常用

    序列化操作对于开发人员来说最熟悉不过了. 序列化分为:序列化和反序列化. 序列化名词解释:序列化是将对象状态转换为可保持或传输的格式的过程. 与序列化相对的是反序列化,它将流转换为对象.这两个过程结合 ...

  9. 如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件

    #0. 准备要转换的xml文件,在Project视界中,右击这个xml文件,在弹出的菜单上选择“Generate XSD schema from XML File...”, 按默认设置生成xsd文件. ...

随机推荐

  1. 【转】iframe和父页,window&period;open打开页面之间的引用

    [转]iframe和父页,window.open打开页面之间的引用 iframe和父页,window.open打开页面和被打开页面之间的关系可以通过下面的对象获取到 1)通过iframe加载的,在if ...

  2. 2015ACM&sol;ICPC亚洲区上海站

    5573 Binary Tree(构造) 题意:给你一个二叉树,根节点为1,子节点为父节点的2倍和2倍+1,从根节点开始依次向下走k层,问如何走使得将路径上的数进行加减最终结果得到n. 联想到二进制. ...

  3. photoshop&comma; 钢笔上色

    photoshop中用 钢笔工具 勾好轮廓后,使用 路径选择工具 选中轮廓,右键弹出菜单中选 创建矢量蒙板,然后就可以在区域内用 笔刷工具 涂抹上色,不用担心出界了. ----补充2017-1-2 将 ...

  4. Android Studio2&period;x版本无法自动关联源码的解决方法

    Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...

  5. Marshal 类的内存操作的一般功能

    Marshal类 提供了一个方法集,这些方法用于分配非托管内存.复制非托管内存块.将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法. 命名空间:System.Runtim ...

  6. ASP&period;NET - List&lt&semi;&gt&semi; 绑定 DropDownList

    代码: //声明泛型 List<category> inof = new List<category>();//二级分类 //声明类使用的对象类 public class ca ...

  7. Linked List 实例

    文件功能:实现了动态建立一个学生信息的链表包括链表的创建.插入.删除.和打印输出学生信息包括姓名和分数 #include<iostream> #include<string> ...

  8. 更改MySQL密码

    #安装MySQL5.7参考:https://blog.csdn.net/qq_23033339/article/details/80872136#MYSQL的基础操作参考:https://www.cn ...

  9. 详解intellij idea搭建SSM框架&lpar;spring&plus;maven&plus;mybatis&plus;mysql&plus;junit&rpar;&lpar;上&rpar;

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...

  10. Win7 VS2017编译Audacity2&period;1&period;3

    最近比较热衷折腾大型开源软件编译,因为在逐渐用开源软件替换盗版软件,除去盗版用着不安全的原因外,主要还是因为开源软件有源码,可以学习研究,另外就是体积小. 像Matlab每次装完都用不上什么功能,体积 ...