Java必备技能之 Xml解析与生成,再也不怕Xml与Bean的转化了

JAVA 实现从xsd 解析成xml,无套路上代码 java 实现XSD 转 xml 全流程 阅读详情

1 背景

声明:本文不涉及XML节点操作,仅仅适用于Bean与XML的转化过程。
当第三方接口传输格式为XML格式,拼接XML格式参数以及解析XML响应结果是无法逃避的问题。类似这种场景,不需要操作XML的DOM节点,只要会XML与DOM转化即可。

2 XML解析与生成

2.1 工具类

由于不需要操作XML节点,所以不需要引入类似dom4j之类的解析框架,仅仅使用JDK 1.8 的API即可。为了更好的操作,需要编写合适的工具类。下面给出代码,需要的请拿走。

package xyz.yq56.sdk.util;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * @author yiqiang
 */
@SuppressWarnings("unused")
public class JaXmlBeanUtil {

    public static String convertToXml(Object obj) {
        return convertToXml(obj, "UTF-8");
    }

    /**
     * JavaBean转换成xml
     */
    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;
    }

    /**
     * xml转换成JavaBean
     */
    @SuppressWarnings("unchecked")
    public static <T> T convertToJavaBean(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.2 相关注解

XML与Bean的转化依赖于注解,下面给出常用注解

  • @XmlRootElement(name = “response”)
    该注解表明这是XML的根节点,必须存在。XML的解析与生成会从标有此注解的地方开始,而中间对象标注或不标注不影响结果。
  • @XmlAccessorType(XmlAccessType.FIELD)
    常与@XmlRootElement联用,表明所有属性均会被解析。如果设置为XmlAccessType.PROPERTY,则只会解析拥有get和set方法的属性。
  • @XmlElementWrapper
    当使用了集合时,需要标注此注解。会在外层包裹一个集合标签,默认使用属性名称。但这样会出现一个问题,集合标签和元素标签都使用的同一个属性名称。为解决这个问题,一般还需要添加@XmlElement改变元素的名称。
  • @XmlElement
    这个注解可以改变属性对应的XML节点名称,类似@JsonProperty
  • @XmlJavaTypeAdaptor
    标注在接口 属性上,为接口指定具体的实现类。当属性为接口时,必须指定该注解。

2.3 使用步骤

2.3.1 定义XML对应的Bean

定义三个Bean,具体注解含义见2.2

@Getter
@Setter
@XmlRootElement(name = "response")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class ResponseElement {
    private int id;
    private String name;

    @XmlElementWrapper
    @XmlElement(name = "user")
    private List<User> userList;

}

@Getter
@Setter
public class User {
    private int id;
    private String username;
    private String password;
}

//测试继承
@Getter
@Setter
@XmlRootElement
public class ResponseExt extends ResponseElement{
    private String field1;
}

2.3.2 使用工具类进行解析

  • 生成XML:String xml=JaXmlBeanUtil.convertToXml(requestElement)
  • 解析XML:ResponseExt responseExt=JaXmlBeanUtil.convertToJavaBean(xml, ResponseExt.class);

3 效果展示

3.1 测试代码

/**
 * @author Yi Qiang
 * @version 1.0.0
 * @date 2020/10/12 19:05
 */
@Slf4j
public class XmlTest {
    private static ObjectMapper mapper=new ObjectMapper();

    public void marshal() {
        ResponseElement response=new ResponseElement();
        response.setId(1);
        response.setName("yq");

        User user=new User();
        user.setId(1);
        user.setUsername("test");
        user.setPassword("123456");

        User user2=new User();
        user2.setId(2);
        user2.setUsername("test2");
        user2.setPassword("1234562");

        List<User> list=new ArrayList<User>();
        list.add(user2);
        list.add(user);
        response.setUserList(list);
        log.info(JaXmlBeanUtil.convertToXml(response));


        ResponseExt ext=new ResponseExt();
        ext.setField1("field1");
        ext.setUserList(list);
        ext.setId(3);
        ext.setName("test3");

        log.info(JaXmlBeanUtil.convertToXml(ext));
    }

    public void unmarshal() throws JsonProcessingException {


        String xml="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                "<responseExt>\n" +
                "    <id>3</id>\n" +
                "    <name>test3</name>\n" +
                "    <userList>\n" +
                "        <user>\n" +
                "            <id>2</id>\n" +
                "            <password>1234562</password>\n" +
                "            <username>test2</username>\n" +
                "        </user>\n" +
                "        <user>\n" +
                "            <id>1</id>\n" +
                "            <password>123456</password>\n" +
                "            <username>test</username>\n" +
                "        </user>\n" +
                "    </userList>\n" +
                "    <field1>field1</field1>\n" +
                "</responseExt>";

        ResponseElement responseElement = JaXmlBeanUtil.convertToJavaBean(xml, ResponseExt.class);
        log.info(mapper.writeValueAsString(responseElement));
    }

    public static void main(String[] args) throws JsonProcessingException {
        XmlTest test=new XmlTest();
        test.marshal();
        log.info("");
        test.unmarshal();
    }


}

3.2 运行结果

14:08:04.936 [main] INFO xyz.yq56.test.XmlTest - <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <id>1</id>
    <name>yq</name>
    <userList>
        <user>
            <id>2</id>
            <password>1234562</password>
            <username>test2</username>
        </user>
        <user>
            <id>1</id>
            <password>123456</password>
            <username>test</username>
        </user>
    </userList>
</response>

14:08:05.018 [main] INFO xyz.yq56.test.XmlTest - <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<responseExt>
    <id>3</id>
    <name>test3</name>
    <userList>
        <user>
            <id>2</id>
            <password>1234562</password>
            <username>test2</username>
        </user>
        <user>
            <id>1</id>
            <password>123456</password>
            <username>test</username>
        </user>
    </userList>
    <field1>field1</field1>
</responseExt>

14:08:05.018 [main] INFO xyz.yq56.test.XmlTest - 
14:08:05.274 [main] INFO xyz.yq56.test.XmlTest - {"id":3,"name":"test3","userList":[{"id":2,"username":"test2","password":"1234562"},{"id":1,"username":"test","password":"123456"}],"field1":"field1"}

4 结语

对于第三方接口对接,难免遇到XML传输。如果本文对你有所帮助,请给我点个赞!!与君共勉

SpringBoot开发者必备的6大AI协同技能 SpringBoot作为主流Java微服务框架,其强约定、多版本、高耦合特性带来了大量配置管理、依赖协调与自动装配理解成本。掌握基于自然语言与AI深度协同的工程化能力,已成为提升开发效能的关键路径。这涉及精准建模上下文、结构化拆解需求、识别配置作用域边界、驱动多文件拓扑生成、理解Spring Boot启动生命周期,以及利用运行时反馈闭环优化提示——本质上是在构建人与AI之间的‘SpringBoot语义协议’。该能力不替代编码,而是将开发者从胶水代码中解放,聚焦领域建模与系统设计,特别适用于已具备Spring 阅读详情

相关推荐

Spring源码核心解析:IoC容器、Bean生命周期与AOP原理实战

控制反转(IoC)是Spring框架的基石,它通过将对象的创建与依赖管理交由容器负责,实现了组件间的解耦。其核心原理在于BeanFactory与ApplicationContext构成的容器体系,它们读取配置元信息,解析为BeanDefinition,并管理Bean的完整生命周期——包括实例化、依赖注入、初始化及销毁。这一机制的技术价值在于提供了强大的可扩展性,通过BeanPostProcessor等扩展点,开发者可以干预Bean的创建过程,实现如AOP、事务管理等高级功能。在应用场景上,IoC容器广泛应用

weixin_30675247的博客 708

使用XStream将xml字符串(文件)反序列化为javaBean去掉最外层(或根节点)的一种方法

可以将每层封装为类,然后使用XStream的processAnnotations函数将xml从外到内每个类添加进去,processAnnotations函数的作用是 Process the annotations of the given type and configure the XStream. A call of this method will automatically turn t...

HEYU17的博客 1683

百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析)

本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。

loss4bartender的博客 688

Java基础 - XML解析转成Bean以及Bean转成XML(附带案例)

文章目录1. JAXB - Java Architecturefor XML Binding - 面向XML绑定的Java体系结构1.1 注解1.2 使用**测试1 - 反序列化xml文件成JavaBean对象****测试2 - 序列化普通JavaBean对象****测试3 - 序列化JavaBean对象字段中含有容器Collection -> xml字符串****测试4 - 序列化容器对象**测试5 - 复杂报文解析 1. JAXB - Java Architecturefor XML Bindin

weixin_39651356的博客 5563

INMP441麦克风与ESP32的I2S音频采集实战指南

本文提供了INMP441数字麦克风与ESP32开发板通过I2S接口进行高质量音频采集的完整实战指南。详细讲解了硬件连接、软件配置、数据读取及基础处理,并分享了常见的避坑技巧与性能优化建议,帮助开发者快速构建物联网音频应用。

weixin_28396629的博客 599

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

XML文件的解析

XML文件的解析总结 xml的传输在程序就开发中开始很常见的,在网上看了其他人的总结,总感觉不是那么的傻瓜, 给别人看了总是感觉云里雾里,正好最近项目涉及到XML的解析,那么我就用实际的例子来 总结一下XML的解析。 首先建一个PO类,来存储节点的值,也方便以后数据的存取 可能你觉得这PO类是不是多余了,开始我也这么认为,后来 我发现真的很好用,当然有的时候没有用。

DeanChai的博客 456

ChatGPT高效制作PPT:从内容生成到设计优化全流程

人工智能技术正在改变传统办公文档的创作方式,其中自然语言处理(NLP)与生成式AI的结合为内容创作带来了革命性突破。以ChatGPT为代表的大语言模型(LLM)能够理解复杂指令并生成结构化内容,其核心原理是通过海量数据训练获得的语义理解和文本生成能力。在办公自动化场景中,这种技术特别适合解决PPT制作中的两大痛点:内容创作耗时和逻辑架构困难。通过精心设计的提示词工程,AI可以快速输出包含核心要点、数据支撑的完整内容框架,甚至直接生成Markdown格式的代码以便快速转换为PPT。对于商业计划、项目汇报等高频

weixin_42613018的博客 495

使用JAXB类库实现XML与JAVA对象的互转

第一章 前言    ​       XML是开发中常用的配置文件类型,在常用的组件包里也能时常看到它的踪影,如Spring中的applicationContext.xml、Hibernate中的hbm.xml,都是用的XML来配置相关的参数信息。可见其使用是十分广泛的。         JAXB是Java Architecture for XML Binding的缩写,用于在Java类

师旭阳_码农日记 889

H265/HEVC视频分层码流分析语义元素解释

一、H265概述 H265/HEVC(Hight Efficiency Video Coding)是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准,主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行了详细的分析,本文继续从数据处理的角度对H265/HEVC视频码流进行详细分析。 二、H265分层结构 H265的分层结构与H264类似,分为视频编码层(VCL:Video Code Layer)和网络抽象层(NAL

weixin_43876729的博客 9432

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1898

Spring解密 - XML解析 与 Bean注册

Spring是一个开源的设计层面框架,解决了业务逻辑层和其他各层的松耦合问题,将面向接口的编程思想贯穿整个系统应用,同时它也是Java工作中必备技能之一…

唐亚峰 676

【Simulink教程案例18】基于simulink的基础OFDM+64QAM发射接收链路仿真

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的。

FPGA/MATLAB学习教程/源码/项目合作开发 1990

免费开源光盘盘面图像生成工具 DiscImageStudio 使用指南:功能、适用场景与避坑清单

DiscImageStudio 是一款免费开源的光盘盘面图像生成与刻录工具,基于 C# 与 .NET 10 开发,支持 Windows、Linux 与 macOS,采用 GPL-3.0 许可证。它能把一张普通图片转换成符合 CD、DVD、单层蓝光物理层约束的数据,刻录后光盘盘面会呈现肉眼可见的图案。工具不联网、不上传文件、不收集遥测。 ## 核心能力速览:它能帮你省哪些事 - **三种介质全覆

gitblog_00816的博客 633

uniapp [全端兼容] - 实现上传本地视频到后端服务器及在线预览播放视频+移除视频+进度条上传,将已选视频上传服务端并可预览视频和删除功能,上传单个或多个视频文件及大文件(H5、小程序、app)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp+uview上传视频并预览,UNI-APP视频上传组件,实现视频文件上传视频回显,上传视频并预览、上传多个视频,实现上传视频功能+预览,上传显示视频功能,上传视频预览移除,批量上传视频,上传超大视频文件,视频上传并预览效果,uniapp上传视频,使用uview上传视频及预览,上传视频和删除视频功能,视频流上传播放功能,上传视频到后端,视频上传与实时预览功能,upload上传组件,视频播放器

🏆 前端领域优质创作者 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring框架深度揭秘:掌握现代Java开发必备技能

Spring 是分层的、JavaSE/EE 一站式(full-stack)、轻量级开源框架。JavaEE 分层JavaEE 规范的三层结构体系:表现层(页面数据显示、页面跳转调度),例如 jsp/servlet业务层(业务处理和功能逻辑、事务控制),例如 service持久层(数据存取和封装、和数据库打交道),例如 dao表现层:struts1、struts2业务层:Ioc、AOP、事务控制持久层、ORM 框架(对象关系映射)整合。

蓝鲸鱼计算机软件开发工作室 1217

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

视频教程-Java高阶必备技术:Spring必知必会-Java

Java高阶必备技术:第一章——Spring 优快云学院Java工程师 ...

weixin_28855365的博客 188

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?

今天收到一个工作 4 年的粉丝的面试题。问题是:“Spring 中有哪些方式可以把 Bean 注入到 IOC 容器”。他说这道题是所有面试题里面回答最好的,但是看面试官的表情,好像不太对。我问他怎么回答的,他说: “接口注入”、“Setter 注入”、“构造器注入”。为什么不对?来看看高手的回答。

sinat_53467514的博客 974

Java面试必备:Spring启动过程详解

Spring框架作为Java企业级应用开发的事实标准,其启动过程是每个Java开发者都应该深入理解的核心机制。本文将详细解析Spring容器的启动流程,并通过流程图帮助您更好地理解这一过程。

qq_58299462的博客 2021

深入解析Spring Bean生命周期:从原理到实战应用

依赖注入(DI)和控制反转(IoC)是现代Java企业级应用开发的核心设计模式,它们通过将对象的创建与依赖管理交由容器负责,实现了组件间的松耦合。其底层原理基于Bean的生命周期管理,涵盖了从Bean定义、实例化、属性填充到初始化的完整流程。理解这一机制的技术价值在于,它不仅是框架高效运作的基础,更是开发者解决复杂工程问题的关键,例如处理循环依赖、实现自定义初始化逻辑以及优化应用启动性能。在实际应用场景中,掌握Spring Bean生命周期有助于精准定位因初始化顺序不当导致的空指针异常,并能够通过BeanP

weixin_30493401的博客 441

十年架构师详解,Spring-IoC容器装配Bean

先看一下Spring容器内部是如何协助的,也就是Spring容器、Bean的配置信息、Bean的实现类及应用程序之间的关系,如下图 由上图我们看到,一个Bean从创建到被程序使用经历了四个阶段。本文主要讲解Bean在Spring中的装配。装配方式主要分为如下几种。 1. 基于XML的配置 1.1 依赖注入 依赖注入分为几种方式:属性注入、构造函数注...

qq_39662660的博客 359

mysql集群方案对比,架构师必备技能

下面总结了我这一段时间面试出现的一些spring高频问题 什么是 Spring 框架?Spring 框架有哪些主要模块? 使用 Spring 框架能带来哪些好处? 什么是控制反转(IOC)?什么是依赖注入? 请解释下 Spring 框架中的 IoC? BeanFactory 和 ApplicationContext 有什么区别? Spring 有几种配置方式? 如何用基于 XML 配置的方式配置 Spring? 如何用基于 Java 配置的方式配置 Spring? 怎样用注解的方式配置 Spring? 请

m0_57768035的博客 313

【Spring专题】「原理系列」全方面解析SpringFramework的Bean对象的深入分析和挖掘指南

Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集存中…(img-ON05JiGU-1714157718248)]

2401_84003554的博客 970

java timer里 @autowired报错_Java小白进阶到大牛,你需要掌握这10项技能

如何成为Java大神?听说掌握了一下10项全能就可以成为Java大神。目前还是java小白的话还是脚踏实地一步一步来,别好高骛远,下面和千锋广州Java小编一起来看看吧!1、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。2、命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟 悉:appletviewer、 Ht...

weixin_32780623的博客 104

学习springboot必备---spring注解驱动开发1-bean的创建

这篇文章主要介绍spring的基础注解的使用,为springboot的学习打下基础 如果小伙伴们看springboot中大量的底层基础注解感觉懵懵的话,那么看这篇文章就对了,这篇文章是复习spring的一些注解,可以对学习springboot有帮助。 spring Bean的创建方式 在之前我们注册一个bean可能是这样的: 在spring的配置文件中写一下内容: <bean id="school" class="com.xxx.school"> <property name="name

jsty181818的博客 531
上一篇: 远离996之神技能:泣血经验,每天过一遍
下一篇: Nginx启动异常及解决方案:Failed to start SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy
一步一结
博客等级 码龄7年 50粉丝 65原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值