一、     JAXB是什么?

JAXB(即Java Architecturefor XML Binding)是一个业界的标准,即是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。

 

二;相关注解的解释

1)      @XmlType

该注解用在class类上,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

 

2)      @XmlElement

该注解用在类的属性上,用于将属性映射为xml的子节点。可通过在后面配置name属性值来改变java属性在xml文件中的名称。如:

效果如下:

注意:@XmlElement转化的属性的格式是<STATUS>1</STATUS>这种形式,中间的1代表属性STATUS的值。

 

3)      @XmlRootElement

类级别的注解,对应的是xml文件中的根节点。常与 @XmlType 和 @XmlAccessorType一起使用。如

@XmlRootElement最核心的作用是用来配置根节点名称

效果如下

 

4)      @XmlAttribute

用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:

效果如下:

通过@XmlAttribute将对应的属性放在同root目前一起。作为root区域的属性存在

 

5)      @XmlAccessorType

  @XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,分别为:

  XmlAccessType.FIELD:java对象中的所有成员变量;

  XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量;

  XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量;

  XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素。

注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER。因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE,如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

 

6)      @XmlAccessorOrder

用于对java对象生成的xml元素进行排序。它有两个属性值:

  AccessorOrder.ALPHABETICAL:对生成的xml元素按字母顺序排序;

 XmlAccessOrder.UNDEFINED:不排序。

效果如下:

 

 

 

7)      @XmlTransient

用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。

 

 

 

 

8)      @XmlJavaTypeAdapter

  @XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。

  @XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类

 

三;xml和bean之间的转化

1:通过

javax工具类
package kai.wu.dhwerservice.biz.xml;

import javax.xml.bind.*;


import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Optional;

/**
 * * *  GOOK LUCK  * *
 *
 * @Author: wkn,
 * @Date: 2020/11/5.
 * @DESC:
 */
public class JaxbXmlUtil {



    /**
     * java对象转换为xml文件
     * @param load    java对象.Class
     * @return    xml文件的String
     * @throws JAXBException
     */
    public static String beanToXml(Object obj, Class<?> load,String encoding) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(load);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
        Optional.ofNullable(encoding).map((x) -> {
            try {
                 marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
            } catch (PropertyException e) {
                e.printStackTrace();
            }
            return "";
        });
        StringWriter writer = new StringWriter();
        marshaller.marshal(obj, writer);
        return writer.toString();
    }

    /**
     * xml文件配置转换为对象
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    java对象
     * @throws JAXBException
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    public static <T> T xmlToBean(String xmlPath, Class<T> load) throws JAXBException, IOException {
        JAXBContext context = JAXBContext.newInstance(load);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        return (T) unmarshaller.unmarshal(new StringReader(xmlPath));
    }

    /**
     * JavaBean转换成xml
     * 默认编码UTF-8
     * @param obj
     * @return
     */
    public static String convertToXml(Object obj) {
        //       return convertToXml(obj, "UTF-8");
        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;
    }

    /**
     * JavaBean转换成xml去除xml声明部分
     * @param obj
     * @param encoding
     * @return
     */
    public static String convertToXmlIgnoreXmlHead(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);
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
            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:测试


        ImlDemoInterface imlDemoInterface = new ImlDemoImpl();
        XmlTransferResponse response = new XmlTransferResponse();
        response.setId(1);
        XmlTransferRequest request = new XmlTransferRequest();
        request.setName("na");
        request.setStatus("1");
        request.setAddress("fd");

        //格式转化,将bean转化为xml
        String xml = JaxbXmlUtil.beanToXml(request,R,"utf-8");
        System.out.println(xml);
        //将xml转化为bean
        XmlTransferRequest response1 = JaxbXmlUtil.xmlToBean(xml,XmlTransferRequest.class);
        System.out.println(response1.toString());



        System.out.println(xml);
        System.out.println(""+R);
        System.out.println(""+T);
        System.out.println(""+request+response+"");

 测试结果

 

 

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐