JAXB使用

Author Avatar
丁起男 01月 05,2021
  • 在其它设备中阅读本文章

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来看,它的作用就是指定生成元素的顺序

原文:https://blog.csdn.net/wn084/article/details/80853587