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();
    }

}
相关推荐
武子康2 天前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
Ll13045252984 天前
基于 COM 的 XML 解析技术(MSXML) 的总结
xml
在代码的海洋中寻找亚特兰蒂斯5 天前
AJAX对于XML和JSON的处理
xml·ajax·json
BinField6 天前
ToolsSet之:XML工具
xml·windows·microsoft
SEO-狼术6 天前
Connect Directly to Oracle XML Data
xml·数据库·oracle
YSoup6 天前
2025年目前最新版本Android Studio自定义xml预览的屏幕分辨率
android·xml·android studio
abcnull8 天前
mybatis的mapper对应的xml写法
xml·sql·spring·mybatis·mapper
Blue桃之夭夭8 天前
HTML、XML、JSON 是什么?有什么区别?又是做什么的?
xml·html·json
小于村8 天前
pom.xml 文件中配置你项目中的外部 jar 包打包方式
xml·java·jar
扶风呀8 天前
pom.xml中标签详解_
xml