JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

一、先看个简单的例子

实体类:UserInfo.java

packagecom.demo.bean;importjavax.xml.bind.annotation.XmlElement;importjavax.xml.bind.annotation.XmlElementWrapper;importjavax.xml.bind.annotation.XmlRootElement;importjava.util.Arrays;

@XmlRootElementpublic classUserInfo {private intid;privateString name;privateString gender;privateString addr;privateString[] hobbys;publicUserInfo() {

}public UserInfo(intid, String name, String gender, String addr, String[] hobbys) {this.id =id;this.name =name;this.gender =gender;this.addr =addr;this.hobbys =hobbys;

}

@XmlElementpublic intgetId() {returnid;

}public void setId(intid) {this.id =id;

}

@XmlElementpublicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

@XmlElementpublicString getGender() {returngender;

}public voidsetGender(String gender) {this.gender =gender;

}

@XmlElementpublicString getAddr() {returnaddr;

}public voidsetAddr(String addr) {this.addr =addr;

}//使用@XmlElementWrapper注解后,将会在原xml结点上再包装一层xml//@XmlElementWrapper仅允许出现在集合属性上

@XmlElementWrapper(name="allhobbys")

@XmlElement(name="hobby")publicString[] getHobbys() {returnhobbys;

}public voidsetHobbys(String[] hobbys) {this.hobbys =hobbys;

}

@OverridepublicString toString() {return "UserInfo{" +

"id=" + id +

", name='" + name + '\'' +

", gender='" + gender + '\'' +

", addr='" + addr + '\'' +

", hobbys=" + Arrays.toString(hobbys) +

'}';

}

}

实战互转方法

importcom.demo.bean.UserInfo;importorg.junit.Test;importjavax.xml.bind.JAXBContext;importjavax.xml.bind.JAXBException;importjavax.xml.bind.Marshaller;importjavax.xml.bind.Unmarshaller;importjava.io.File;importjava.io.StringReader;importjava.io.StringWriter;public classTest01 {

@Testpublic voidtest(){

UserInfo user= new UserInfo(1,"张三","男","杭州",new String[]{"篮球","音乐"});

String xmlStr=objToXML(user);

System.out.println(xmlStr);

System.out.println("---------------------------------------------------------------");

UserInfo getUser= (UserInfo)xmlStrToObj(xmlStr,UserInfo.class);

System.out.println(getUser);

System.out.println("---------------------------------------------------------------");//编组输出到文件中

objToXmlFile(user,"E:\\user.xml");

UserInfo getUser1= (UserInfo)xmlFileToObj("E:\\user.xml",UserInfo.class);

System.out.println(getUser1);

}publicString objToXML(Object obj){try{//根据obj类生成上下文对象

JAXBContext context =JAXBContext.newInstance(obj.getClass());//从上下文中获取Marshaller对象,用作将bean编组(转换)为xml

Marshaller marshaller =context.createMarshaller();//设置编码格式(默认编码就是utf-8)

marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");//GB2312//以下是为生成xml做的一些配置//是否格式化生成的xml,即按标签自动换行,否则就是一行输出

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);//是否省略xml头部信息,默认不省略(false)

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

StringWriter stringWriter= newStringWriter();

marshaller.marshal(obj, stringWriter);

StringBuilder stringBuilders= newStringBuilder();returnstringBuilders.append(stringWriter).toString();

}catch(JAXBException e) {

e.printStackTrace();

}return null;

}public voidobjToXmlFile(Object obj,String fileUrl){try{

File file= newFile(fileUrl);//根据obj类生成上下文对象

JAXBContext context =JAXBContext.newInstance(obj.getClass());//从上下文中获取Marshaller对象,用作将bean编组(转换)为xml

Marshaller marshaller =context.createMarshaller();//设置编码格式(默认编码就是utf-8)

marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");//GB2312//以下是为生成xml做的一些配置//是否格式化生成的xml,即按标签自动换行,否则就是一行输出

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);//是否省略xml头部信息,默认不省略(false)

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

marshaller.marshal(obj,file);

}catch(JAXBException e) {

e.printStackTrace();

}

}publicObject xmlStrToObj(String xmlStr,Class objClass){try{

JAXBContext jc=JAXBContext.newInstance(objClass);

Unmarshaller unmar=jc.createUnmarshaller();

Object obj= unmar.unmarshal(newStringReader(xmlStr));returnobj;

}catch(JAXBException e) {

e.printStackTrace();

}return null;

}publicObject xmlFileToObj(String xmlFileUrl,Class objClass){try{

File file= newFile(xmlFileUrl);

JAXBContext jc=JAXBContext.newInstance(objClass);

Unmarshaller unmar=jc.createUnmarshaller();

Object obj=unmar.unmarshal(file);returnobj;

}catch(JAXBException e) {

e.printStackTrace();

}return null;

}

}

输出结果:

生成的user.xml文件

二、常用注解解析

1、@XmlRootElement

作用和用法:

类级别的注解,将类映射为xml全局元素,也就是根元素。就像spring配置文件中的beans。上面的例子中我将该注解用在了UserInfo类上,生成了根元素。常与@XmlType,@XmlAccessorType,@XmlAccessorOrder连用。

属性:

该注解含有name和namespace两个属性。namespace属性用于指定生成的元素所属的命名空间。name属性用于指定生成元素的名字,若不指定则默认使用类名小写作为元素名。修改上面的例子,在该注解上使用name属性:

2、@XmlElement

作用和用法:

字段,方法,参数级别的注解。该注解可以将被注解的字段(非静态),或者被注解的get/set方法对应的字段映射为本地元素,也就是子元素。默认使用字段名或get/set方法去掉前缀剩下部分小写作为元素名(在字段名和get/set方法符合命名规范的情况下)。上面例子中,id、addr、name、gender、hobby 都被映射成了元素的子元素。下文会配合@XmlAccessorType注解详细讲解该注解的用法。常与@XmlValue,@XmlJavaTypeAdapter,@XmlElementWrapper连用。

属性:

该注解的属性常用的属性有有:name、nillable、required、namespace、defaultValue

name属性可以指定生成元素的名字,同@XmlRootElement注解的name属性一样,不再举例。

nillable属性可以指定元素的文本值是否可以为空,默认为false。

required属性可以指定该元素是否必须出现,默认为false。

namespace属性可以指定该元素所属的命名空间。

defaultValue属性可以指定该元素默认的文本值。

3、@XmlAttribute

作用和用法:

字段和方法级别的注解。该注解会将字段或get/set方法对应的字段映射成本类对应元素的属性,属性名默认使用字段名或get/set方法去掉前缀剩下部分首字母小写(在字段名和get/set方法符合命名规范的情况下)。修改上面例子:

属性:

该注解有name,required,namespace三个属性。用法和@XmlElement注解相同。

4、@XmlTransient

作用和用法:

类,字段,方法级别的注解。可使JAXB在映射xml元素时忽略被注解的类,字段,get/set对应字段。需要注意的是该注解与所有其他JAXB注释相互排斥,也就是说与其他注释连用就会报错。修改上面例子:

属性:

该注解没有属性。

5、@XmlJavaTypeAdapter

作用和用法:

包、类、字段,方法、参数级别的注解。解决java日期(Date),数字(Number)格式化问题。直接看例子,修改UserInfo类,添加一个Date类型字段:

自定义一个适配器来解决这个问题。该注解的用法就是自定义适配器并继承XmlAdapter类,实现里面的marshal和unmarshal方法,并在该注解上引用。修改例子:

自定义的DateAdapter:

public class DateAdapter extends XmlAdapter{private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");

@Overridepublic Date unmarshal(String date) throwsException {returnSDF.parse(date);

}

@Overridepublic String marshal(Date date) throwsException {returnSDF.format(date);

}

}

6、@XmlAccessorOrder

作用和用法:

包和类级别的注解。控制生成元素的顺序。

属性:

只有一个value属性,可取的值是一个名为XmlAccessOrder的枚举类型的两个值,XmlAccessOrder.ALPHABETICAL 和 XmlAccessOrder.UNDEFINED。默认为XmlAccessOrder.UNDEFINED,代表按照类中字段的顺序生成元素的顺序。

另一个值则代表按照字母表的顺序对生成的元素排序。但奇怪的是,只有jaxb按照field生成元素时,默认值才会生效,否则总是按照字母表的顺序排序。

7、@XmlAccessorType

作用和用法:

包和类级别的注解。javaEE的API对该注解的解释是:控制字段是否被默认序列化。通俗来讲,就是决定哪些字段或哪些get/set方法对应的字段会被映射为xml元素,需要注意的是字段或get/set方法的访问权限(public/private)会影响字段是否被映射为xml元素,下面会详细讲解。

属性:

该注解只有一个value属性,可取的值是一个名为XmlAccessType的枚举类型里的值,下面详细看一下这几个值分别有什么用:

XmlAccessType.PROPERTY:

1.当使用了该值,只要字段有对应的get/set方法对(注意是成对出现,只有其中一个不会发生映射),不需要使用@XmlElement注解,不论该方法的访问权限是什么(即使是private),jaxb就会将该字段映射成xml元素。不过最好加上@XmlElement注解,get/set方法任选一个即可,都加上会报错。

2.若在一个字段有set/get方法对但又在字段上添加@XmlElement注解会报属性重复的错误。

3.若没有set/get方法对,则需要在字段上使用@XmlElement注解才可以映射为xml元素,否则不会发生映射。

4.若get/set方法上使用了@XmlTransient注解,但想要对应字段发生映射,需要在对应字段上添加@XmlElement注解,此时不会报错,并将该字段映射为xml元素。

XmlAccessType.FIELD:

1.每个非静态的字段(无论访问权限如何)都会被jaxb映射为xml元素,即使没有get/set方法对,即使没有使用@XmlElement元素,但最好加上该注解以表明该字段要被映射为xml元素。

2.虽然没有get/set方法对,也会发生映射,但加上get/set方法对也不会报错,因为我们经常会使用这两个方法。但注意,不能再在这两个方法上使用@XmlElement方法,否则会报属性重复的错误。

3.若在字段上使用了@XmlTransient注解,但还想让该字段发生映射,需要在该字段对应的get/set方法上添加@XmlElement

XmlAccessType.PUBLIC_MEMBER: (该值为默认值):

1.每个访问权限为public的字段,或者每个访问权限为public的get/set方法对,都会将字段映射为xml元素,即使不使用@XmlElement,但最好加上。不可同时存在public字段和对应的get/set方法对,不然会报属性重复的错误。

2.若使用@XmlElement注解,需要注意只能在字段或get/set方法添加,两者任选其一,否则会报属性重复的错误。

3.若字段不为public,get/set方法为public并使用了@XmlTransient,需要在字段上添加@XmlElement才会发生映射。

若字段为public并使用了@XmlTransient,get/set方法对不为public,需要在get/set方法上使用@XmlElement才会映射。

XmlAccessType.NONE:

任何字段,get/set方法对都不会发生映射,除非使用某些注解,如@XmlElement,@XmlElementWrapper等。

xml java jaxb_JAXB java类与xml互转相关推荐

  1. java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...

    一.前言 通过dom4j解析XML文档的XMLDocUtil工具类,进行解析xml字符串为Document文档对象.获取根节点元素路径内容getRootElement.获取唯一路径节点的值getSin ...

  2. xml教程之java解析xml文档

    1.java解析xml文件介绍 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX: ...

  3. C#实现实体类和XML相互转换

    一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T& ...

  4. C#中XML、JSON、类T数据格式之间的转换

    在C#中,XML与JSON之间可以相互转化 XML与T类型也可以相互转化[XML有且只有一个根节点] JSON与T类型也可以相互转化. 新建控制台应用程序JsonToXmlToClassDemo,(. ...

  5. Xml转Java实体类对象 xml转Javabena 对象 且多级嵌套 复杂嵌套

    最近在做企微开发,遇到了一个比较复杂的xml然后要去我将xml转成实体类 xml如下 <xml><ToUserName><![CDATA[toUser]]>< ...

  6. 好用的对象转xml、xml转对象工具类-支持集合嵌套转换(Java实现)

    好用的对象转xml.xml转对象工具类-支持集合嵌套转换(Java实现) 网上找了很多转换工具,对于自己的业务都不是很合适,所以总结了一下网上的方案,最终定下来是这样子的,主要使用dom4j做操作 m ...

  7. XMLReader—一个可以读取XML文件的java类

    在我的博文java ArrayList代替数组中有个XMLReader类,这是一个可以读取XML文件的java类,它的实现过程是怎样的呢?接下来让我们看看XMLReader的实现过程: 首先你要下载一 ...

  8. java实体类转换xml_简单实体类和xml文件的相互转换方法

    最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简 ...

  9. jaxb xml 生成 java_使用 JAXB 工具根据 Java 类生成 XML 模式

    使用 JAXB 工具根据 Java 类生成 XML 模式 2010-06-10 18:24:26|  分类: web service |字号 订阅 关键字: java to xml 使用 JAXB 工 ...

最新文章

  1. CentOS7使用阿里云镜像安装Mongodb
  2. 【机器学习基础】一文归纳Python特征生成方法(全)
  3. springboot+springsecurity+mybatis plus之用户认证
  4. java nio 阻塞_Java NIO和传统阻塞IO
  5. 让你的JXTA应用更加安全.建立真正你自己的私有的组!
  6. NAT类型及检测方法
  7. mysql5.7解压版错误_mysql 5.7 解压版 安装net start mysql 发生系统错误 2
  8. Python中对象名称前单下划线和双下划线有啥区别
  9. C++sort函数使用总结
  10. QT打包后音频不响应的问题
  11. elipse与数据库Mysql连接,并实现创建数据表的功能
  12. 内存和flash区别
  13. java.util.TaskQueue的最小堆排序算法的应用
  14. python list 迭代_python迭代、列表生成式
  15. TCP-IP计算机网络基本概述
  16. freemarker 解析对象的某元素_FreeMarker标签介绍及各种数据类型处理
  17. 【论文阅读】DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting
  18. intel万兆以太网网卡吞吐量测试
  19. nodejs:underscore模块介绍
  20. 松下服务器分频器输出信号与,松下伺服连接直线电机应用

热门文章

  1. linux shell命令对时间的处理(精确到秒、毫秒、纳秒)——筑梦之路
  2. 初级会计--税法公式大全(二)
  3. 如何在微软官网下载原版Win11镜像iso文件
  4. 蓝牙三国q 1.92 java,蓝牙三国杀killhd
  5. 红米手机android无法开机画面,Android自动化之遇到的坑——解决View Hierarchy不能启动...
  6. Gyp语法规则参考 工具的使用
  7. Pytorch中backward函数
  8. Android rom开发:固定设置wifi热点的ip、ssid及密码
  9. SF16 | “凹凸“均线形态交易策略源码(技术帖)
  10. Hadoop Federation联邦机制