使用JAXB将xml转成Java对象

2023-09-18 21:31:26

使用JAXB将xml转成Java对象

工作中遇到个问题,需要将xml转对象,之前复杂的xml都是自己用dom4j来解析组装成Java对象,但是对于简单的,看到了JAXB处理的这种方式,就整理下,写成个工具类。

1. xml内容

city.xml

<?xml version="1.0" encoding="UTF-8" ?>
<c c1="0">
    <a>10</a>
    <b>20</b>
    <d d1="101280101" d2="重庆" d3="nanping" d4="南坪"/>
    <d d1="101280102" d2="重庆" d3="yubei" d4="渝北"/>
    <d d1="101280103" d2="重庆" d3="dadukou" d4="大渡口"/>
</c>

2. Java对象类

  • CityList.xml
package com.stormkai.jaxb;

import lombok.Data;
import javax.xml.bind.annotation.*;
import java.util.List;

@Data
@XmlRootElement(name = "c")
@XmlAccessorType(XmlAccessType.FIELD)
public class CityList {

    @XmlAttribute(name = "c1")
    private String c1;

    @XmlElement(name = "a")
    private String a;

    @XmlElement(name = "b")
    private String b;

    @XmlElement(name = "d")
    private List<City> cityList;
}

  • City.java
package com.stormkai.jaxb;

import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@Data
@XmlRootElement(name = "d")
@XmlAccessorType(XmlAccessType.FIELD)
public class City {

    @XmlAttribute(name = "d1")
    private String cityId;

    @XmlAttribute(name = "d2")
    private String cityName;

    @XmlAttribute(name = "d3")
    private String cityNode;

    @XmlAttribute(name = "d4")
    private String area;
}

JAXBContext类,是应用的入口,用于管理XML/Java绑定信息
Unmarshaller接口,将XML数据反序列化为Java对象
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化

  • PUBLIC_MEMBER :默认值,public权限亦或是具有get/set方法属性
  • FIELD:对象中的所有属性
  • PROPERT:对象中所有具备get/set方法的属性
  • NONE:对象的所有属性都不映射

@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)
@XmlRootElement,将Java类或枚举类型映射到XML元素
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性

3. 封装的工具类

XmlBuilder.java

package com.stormkai.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.Reader;
import java.io.StringReader;

public class XmlBuilder {

    public static <T> T xmlToObj4Jaxb(Class<?> clazz, String xml){
        try {
            T xmlObject;
            Reader reader;
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            reader = new StringReader(xml);
            xmlObject = (T)unmarshaller.unmarshal(reader);
            reader.close();
            return xmlObject;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

4. 测试


public class XmlBuilder {

    public static <T> T xmlToObj4Jaxb(Class<?> clazz, String xml){
        try {
            T xmlObject;
            Reader reader;
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            reader = new StringReader(xml);
            xmlObject = (T)unmarshaller.unmarshal(reader);
            reader.close();
            return xmlObject;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public String getCityXml1(){
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
                "<c c1=\"0\">\n" +
                "    <a>10</a>\n" +
                "    <b>20</b>\n" +
                "    <d d1=\"101280101\" d2=\"重庆\" d3=\"nanping\" d4=\"南坪\"/>\n" +
                "    <d d1=\"101280102\" d2=\"重庆\" d3=\"yubei\" d4=\"渝北\"/>\n" +
                "    <d d1=\"101280103\" d2=\"重庆\" d3=\"dadukou\" d4=\"大渡口\"/>\n" +
                "</c>";
        return xml;
    }

    public static void main(String[] args) {
        String xml = new XmlBuilder().getCityXml1();
        CityList cityList = xmlToObj4Jaxb(CityList.class, xml);
        System.out.println(JSON.toJSONString(cityList));
    }
}

输出结果:

{"a":"10","b":"20","c1":"0","cityList":[{"area":"南坪","cityId":"101280101","cityName":"重庆","cityNode":"nanping"},{"area":"渝北","cityId":"101280102","cityName":"重庆","cityNode":"yubei"},{"area":"大渡口","cityId":"101280103","cityName":"重庆","cityNode":"dadukou"}]}

Process finished with exit code 0

输出的json格式化后:

{
	"a": "10",
	"b": "20",
	"c1": "0",
	"cityList": [{
		"area": "南坪",
		"cityId": "101280101",
		"cityName": "重庆",
		"cityNode": "nanping"
	}, {
		"area": "渝北",
		"cityId": "101280102",
		"cityName": "重庆",
		"cityNode": "yubei"
	}, {
		"area": "大渡口",
		"cityId": "101280103",
		"cityName": "重庆",
		"cityNode": "dadukou"
	}]
}
更多推荐

【Redis】Redis 的学习教程(十一)之使用 Redis 实现分布式锁

1.分布式锁概念在多线程环境下,为了保证数据的线程安全,锁保证同一时刻,只有一个可以访问和更新共享数据。在单机系统我们可以使用synchronized锁、Lock锁保证线程安全。synchronized锁是Java提供的一种内置锁,在单个JVM进程中提供线程之间的锁定机制,控制多线程并发。只适用于单机环境下的并发控制。

解决Nacos配置刷新导致定时器停止执行的问题

1.问题描述我使用了一个定时器类来执行某个任务,并且使用Nacos作为配置中心来管理定时器的配置。我发现当Nacos配置发生变化时,定时器实例会停止执行任务,导致任务无法按预期执行。2.原先的实现方式以下是我原先的代码实现方式:@Component@RefreshScope@RequiredArgsConstructo

英飞凌TC3xx--深度手撕HSM安全启动(四)--TC3xx HSM使能和配置技巧

上一章,我们简单聊了下英飞凌TC3xx的HSM的系统框架、相关UCB、Host和HSM通信模块。今天着重分析HSM的使能。1.系统引入HSM的思考为什么要增加HSM信息安全方面考虑,系统的安全启动、ECU之间安全数据的交互、ECU内部的敏感信息保存TC3xx使能HSM后,HSM的代码应该存放在哪里?在上一章,我们了解到

C++的移动构造和移动赋值运算符

右值引用右值引用(rvaluereferences)是一种新的用于绑定右值的引用类型。那么什么是右值?右值通常是编译器生成的用于表达式计算的临时变量或常量。目前来说,我们还不能安全地使用引用变量来绑定右值。从编译原理上讲,右值是只存在于表达式计算时的未命名值。下面这一表达式产生了一个右值:x+(y*z);//AC++e

SpringBoot携带Jre绿色部署项目_免安装Jdk[Linux服务器]

文章目录SpringBoot携带Jre绿色部署项目[Linux服务器]1.实现步骤2.自测成功,如下2-1环境准备2-2运行项目SpringBoot携带Jre绿色部署项目[Linux服务器]说明:实际应用的不方便场景:1.实际项目部属时,现有服务器可能已安装有Jdk,和自己项目的Jdk版本不一致,不敢轻易安装自己使用的

解决Permission is not allowed后基于Ubuntu23.04安装配置docker与docker-compose

参考:Docker官网-InstallDockerEngineonUbuntu虚拟机里安装ubuntu-23.04-beta-desktop-amd64,开启SSH(换源、备份),配置中文以及中文输入法等基于CentOS7安装配置docker与docker-compose一、InstallusingtheAptrepo

代码随想录算法训练营第二天(C) | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

文章目录前言一、977.有序数组的平方二、209.长度最小的子数组三、59.螺旋矩阵总结前言java版:代码随想录算法训练营第二天|977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵_愚者__的博客-CSDN博客一、977.有序数组的平方双指针法:int*sortedSquares(int*nums,in

二进制 Deploy Kubernetes v1.23.17 超级详细部署

文章目录1.预备条件2.基础配置2.1配置root远程登录2.2配置主机名2.3安装ansible2.4配置互信2.5配置hosts文件2.6关闭防firewalld火墙2.7关闭selinux2.8关闭交换分区swap2.9修改内核参数2.10安装iptables2.11开启ipvs2.12配置limits参数2.1

nginx详解

目录1什么是nginx2Nginx功能2.1正向代理2.2反向代理2.3负载均衡2.4动静分离3区别4Docker安装nginx5nginx配置文件介绍1什么是nginxnginx是一个高性能的http和反向代理服务器,特点是占有内存少、并发能力强,事实上nginx的并发能力的确在同类的服务器中表现较好。nginx转为

聊一聊Twitter的雪花算法

什么是Twitter的雪花算法方法?这是一种在分布式系统中生成唯一ID的解决方案。Twitter在推文、私信、列表等方面使用这种方法。•ID是唯一且可排序的•ID包含时间信息(按日期排序)•ID适用于64位无符号整数•仅包含数字值符号位(1位):保留位(始终为0)。这可以为将来的请求保留。它可以潜在地用于使整体数字为正

vue柱状图+折线图组合

<template><divid="main"style="width:100%;height:500px;padding-top:.6rem"></div></template>data(){return{weekData:["1周","2周","3周","4周","5周","6周","7周","8周","9周","

热文推荐