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类

java 复制代码
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;

}
java 复制代码
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;
}
java 复制代码
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;
}

XMLUtil工具类

java 复制代码
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();
    }

}
相关推荐
Hui Baby2 天前
回顾-springboot自定义xml
xml·java·spring boot
开始了码2 天前
XML文件介绍和QT相关操作
xml·qt
Andy工程师3 天前
logback-spring.xml优先级更高
xml·spring·logback
小江村儿的文杰3 天前
UE4在MacOS上将Commit.gitdeps.xml设为Git LFS文件的潜在弊端
xml·ue4
humstone3 天前
基于xml 和sql 实现自定义报表查询
xml·数据库·sql
就叫飞六吧4 天前
考古spring.xml注册bean无法扫描目录问题
xml·java·spring
Star abuse4 天前
XML转YOLO格式数据集教程
xml·人工智能·yolo
gAlAxy...5 天前
MyBatis 核心配置文件 SqlMapConfig.xml 全解析
xml·mybatis
编程修仙6 天前
第十一篇 Spring事务
xml·java·数据库·spring
金士顿6 天前
Ethercat耦合器添加的IO导出xml 初始化IO参数
android·xml·java