JAXB使用
简介
JAXB(java architecture for XML bingding)是一个业界的标准,是一项可以根据xml schema产生java类的技术。该过程中,jaxb也提供了将xml实例文档反向生成java对象树的方法,并能将java对象树的内容重新写到xml实例文档
例子
实体类
@Data
@XmlRootElement(name = "user")
@XmlType(propOrder = {"id","age","name","myLists"})
public class MyDemo {
private Long id;
private String name;
private Integer age;
private List<MyList> myLists;
}
@Data
@Accessors(chain = true)
@XmlRootElement(namespace = "com.dqn.jaxb.jaxbdemo.pojo.MyDemo")
public class MyList {
private String info;
}
测试(写)
@SneakyThrows
@Test
void test1() {
//根据实体类生成上下文对象
JAXBContext jaxbContext = JAXBContext.newInstance(MyDemo.class);
//从上下文中获取Marshaller对象,作用:将bean编组(转换)为xml
Marshaller marshaller = jaxbContext.createMarshaller();
//格式化输出,即按标签自动换行,否则就是一行输出
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
//设置编码(默认就是utf-8)
marshaller.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");
//是否省略xml头信息,默认不省略(false)
marshaller.setProperty(Marshaller.JAXB_FRAGMENT,false);
//编组到文件
File XMLFile = new File("G:\\IDEAFile\\aaa.xml");
marshaller.marshal(getData(),XMLFile);
//编组到控制台
marshaller.marshal(getData(),System.out);
}
测试(读)
@SneakyThrows
@Test
void test2(){
//根据实体类生成上下文对象
JAXBContext jaxbContext = JAXBContext.newInstance(MyDemo.class);
//从上下文中获取Unmarshaller对象,作用将xml解组(转换)为bean
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
File XMLFile = new File("G:\\IDEAFile\\aaa.xml");
MyDemo myDemo = (MyDemo) unmarshaller.unmarshal(XMLFile);
System.out.println(myDemo);
}
从jdk1.7开始,jaxb就对解组和编组的方法进行了更简单的封装,所以实际项目中除非自己要进行个性化设置,否则大可不用自己再创建JAXBContext实例,直接通过JAXB静态调用相应的工具方法就行了
简化版
@Test
void test3(){
JAXB.marshal(getData(),System.out);
}
@Test
void test4(){
File XMLFile = new File("G:\\IDEAFile\\aaa.xml");
MyDemo unmarshal = JAXB.unmarshal(XMLFile, MyDemo.class);
System.out.println(unmarshal);
}
常用注解
@XmlRootElement
类级别的注解
将类映射为xml全局元素,也就是根元素,就像spring配置文件中的beans
属性
- name:用于指定元素的名称,若不指定则默认使用类名首字母小写作为元素名
- namespace:用于指定生成元素所属的命名空间
@XmlElement
字段、方法、参数级别的注解
该注解可以将被注解的字段(非静态),或者被注解的get/set方法对应的字段映射为本地元素,也就是子元素。默认使用字段名或get/set方法去掉前缀剩下部分小写作为元素名
属性
- name:可以指定生成元素的名字,同@XmlRootElement的name一样
- nillable:可以指定元素的文本值是否可以为空,默认为false
- required:可以指定该元素是否必须出现,默认为false,
- namespace:可以指定该元素所属的命名空间
- defaultValue:可以指定该元素默认的文本值
@XmlAttribute
字段和方法级别使用的注解
该注解会将字段或get/set方法对应的字段映射成本类对应元素的属性,属性默认使用字段名或get/set方法去掉前缀剩下部分首字母小写
属性
该注解有name、required、namespace三个属性。用法和@XmlElement注解相同
@XmlTransient
类、字段、方法级别的注解
可使jaxb在映射xml元素时忽略注解的类、字段、get/set对应的字段
需要主要的是该注解与所有其他jaxb注解相互排斥,也就是说与其它注解连用就会报错
属性
该注解没有属性
@XmlAccessorType
包和类级别的注解
控制字段是否被默认序列化
通俗来讲,就是决定哪些字段或哪些get/set方法对应的字段会映射为xml元素,需要注意的是字段或者get/set方法的访问权限(public/private)会影响字段是否被映射为xml元素
属性
- value:可取值是一个名为XmlAccessType的枚举类型
XmlAccessType
- PROPERTY:jaxb绑定类中每个get/set对都将自动绑定到xml除非用@XmlTransient
- FIELE:jaxb绑定类中的每个非静态、非瞬态字段都将自动绑定到xml,除非使用@XmlTransient
- PUBLIC_MEMBER(默认值):每个公共get/set对和每个公共字段都将自动绑定到xml除非使用@XmlTransient
- NONE:任何字段或属性都不会绑定到xml,除非使用某些jaxb注解进行特别注解
@XmlAccessorOrder
包和类级别的注解
控制生成元素的顺序
属性
- value:可取值是一个名为XmlAccessOrder的枚举类型
XmlAccessOrder
- UNDEFINED(默认):代表按类中字段的顺序生成元素的顺序
- ALPHABETICAL:代表按照字母表的顺序上传元素的排序
@XmlElementWrapper
字段和方法级别的注解
围绕被映射的xml元素生成包装元素。主要用在集合对象映射后生成包装映射结果的xml元素
属性
该注解有name、nilable、namespace、required四个属性,用法同上
@XmlJavaTypeAdapter
包、类、字段、方法、参数级别的注解
解决java日期(Date)、数字(Number)格式化问题
属性
- value:值是一个继承了XmlAdapter的类,类中实现转换格式的逻辑
@XmlValue
字段和方法级别的注解
该注解的作用,简单理解就是定义xml元素文本值的类型
属性
无
@XmlType
类级别注解
主要使用的是它的propOrder属性,简单来说是用来定义xsd中的simpleType或complexType,从生成的xml来看,它的作用就是指定生成元素的顺序