• JAXB实现XML和Bean相互转换


    另一篇转换方式
    xstream实现xml和java bean 互相转换

    XML和Bean转换工具简介

    Java中实现XML和Bean的转换的方式或插件有以下几种:

    JAXB(Java Architecture for XML Binding):JAXB是Java SE的一部分,可以将Java对象与XML文档相互转换。它提供了注解和XML绑定文件两种配置方式。

    Dom4j:Dom4j是一个开源的Java库,用于操作XML文档。它可以将XML文档转换为Java对象,也可以将Java对象转换为XML文档。

    XStream:XStream是一个简单易用的Java库,用于序列化和反序列化对象。它可以将Java对象转换为XML文档,也可以将XML文档转换为Java对象。

    SimpleXML:SimpleXML是一个轻量级的Java库,用于处理XML文档。它可以将XML文档转换为Java对象,也可以将Java对象转换为XML文档。

    Jackson:Jackson是一个流行的Java库,用于处理JSON数据。它也支持将Java对象转换为XML文档,以及将XML文档转换为Java对象。

    JiBX:JiBX是一个强大的Java库,用于处理XML文档。它可以将Java对象与XML文档相互转换,支持多种映射策略。

    Castor:Castor是一个高性能的Java库,用于处理XML文档。它可以将Java对象与XML文档相互转换,支持多种映射策略。

    Apache CXF:Apache CXF是一个开源的Web服务框架,提供了许多用于处理XML和SOAP消息的功能。它支持将Java对象与XML文档相互转换。

    JAXB简介

    这里介绍一下 JAXB,JAXB(Java Architecture for XML Binding)是Java SE的一部分,不需要依赖其他包,可以将Java对象与XML文档相互转换。

    下面是主要介绍常用的注解的基本含义和区别:

    1. @XmlAccessorType: 这个注解用来指定类或属性(字段)的访问类型。它有四个可能的值:FIELD, TYPE, PROPERTY, ALL。默认情况下,JAXB使用FIELD模式,这意味着JAXB将尝试访问类中的所有字段。如果这个注解不存在,那么JAXB将使用默认值。
    2. @XmlRootElement: 这个注解标记一个类作为XML根元素。JAXB将生成一个XML文档,该文档包含根元素以及由类字段/属性定义的任何其他元素。
    3. @XmlElement(name = “Label”): 这个注解表示一个类属性或字段被映射到一个XML元素,并且这个元素的标签名称为"Label"。
    4. @XmlAttribute: 这个注解表示一个类属性或字段被映射到一个XML属性。属性是在XML元素中定义的,并且通常用于表示元素的简单类型值。
    5. @XmlType(propOrder = {“value”, “category”, “background”}): 这个注解定义了当一个类被映射到XML时,元素和属性的顺序。在这个例子中,"value"是首先出现的元素,"category"和"background"是接下来的元素。如果你在propOrder中没有指定元素名称,那么它们将按照它们在类中出现的顺序进行映射。

    使用这些注解的方式通常是在你的Java类中添加它们。例如下边的Java Bean类。

    Java Bean类

    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import java.io.Serializable;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name = "View")
    @XmlType(propOrder = {})
    @Getter
    @Setter
    public class View implements Serializable {
    
        private static final long serialVersionUID = 4678366086955878610L;
    
        @XmlElement(name = "Image")
        private Image image;
    
        @XmlElement(name = "Table")
        private Table table;
    
        @XmlElement(name = "Text")
        private Text text;
    
        @XmlElement(name = "Choices")
        private Choices choices;
    
        @XmlElement(name = "RectangleLabels")
        private RectangleLabels rectangleLabels;
    
        @XmlElement(name = "Labels")
        private Labels labels;
    
        @XmlElement(name = "Rectangle")
        private Rectangle rectangle;
    
        @XmlElement(name = "Polygon")
        private Polygon polygon;
    
        @XmlElement(name = "TextArea")
        private TextArea textArea;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    import java.io.Serializable;
    import java.util.List;
    
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    import lombok.Getter;
    import lombok.Setter;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name = "Labels")
    @XmlType(propOrder = {
            "name",
            "toName",
            "labelList"
    })
    @Setter
    @Getter
    public class Labels implements Serializable {
    
        private static final long serialVersionUID = 4017289488745470829L;
        @XmlAttribute
        private String name;
        @XmlAttribute
        private String toName;
    
        @XmlElement(name = "Label")
        private List<Label> labelList;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    import java.io.Serializable;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    import lombok.Getter;
    import lombok.Setter;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    // XML文件中的根标识
    @XmlRootElement(name = "Label")
    // 控制JAXB 绑定类中属性和字段的排序
    @XmlType(propOrder = {
            "value",
            "category",
            "background"
    })
    @Getter
    @Setter
    public class Label implements Serializable {
    
        private static final long serialVersionUID = 5135918993113626857L;
        @XmlAttribute
        private String value;
        @XmlAttribute
        private String category;
        @XmlAttribute
        private String background;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    XMLUtil工具类

    import java.io.StringReader;
    import java.io.StringWriter;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    public class XMLUtil {
    
        private XMLUtil(){}
        public static Object convertXMLToObject(Class<?> clazz, String xml) {
            Object xmlObject = null;
            try {
                JAXBContext context = JAXBContext.newInstance(clazz);
                // 进行将Xml转成对象的核心接口
                Unmarshaller unmarshaller = context.createUnmarshaller();
                StringReader sr = new StringReader(xml);
                xmlObject = unmarshaller.unmarshal(sr);
            } catch (Exception ex) {
                log.error("XML转换对象失败", ex);
            }
            return xmlObject;
        }
    
        public static String convertToXml(Object obj) {
            // 创建输出流
            StringWriter sw = new StringWriter();
            try {
                // 利用jdk中自带的转换类实现
                JAXBContext context = JAXBContext.newInstance(obj.getClass());
    
                Marshaller marshaller = context.createMarshaller();
                // 格式化xml输出的格式 true 带格式化 false 不带格式化
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
                // true 忽略xml头信息
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
                // 将对象转换成输出流形式的xml
                marshaller.marshal(obj, sw);
            } catch (JAXBException e) {
                log.error("对象转XML失败", e);
            }
            return sw.toString();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    代码随想录第51天 | 309.最佳买卖股票时机含冷冻期 、 714.买卖股票的最佳时机含手续费
    Spring Security使用总结八,Security的第二个功能授权,不同的角色访问不同的资源
    vue目录树的封装
    正大期货主账户留4行情软件用的什么?
    如何在Windows7 上查看.NET Framework版本
    MySQL 8.0 新特性之不可见主键
    PHP服务器端API原理及示例讲解(接口开发)
    一篇了解全MVCC
    SpringBoot——》配置logback日志文件
    代码随想录-025-383.赎金信
  • 原文地址:https://blog.csdn.net/quyingzhe0217/article/details/134418325