Java中XML如何转为BEAN

news2024/11/18 6:40:30

在网络通讯中,对方传的数据经常是XML格式包装的数据集合。在Java开发中,我们如何将XML转成Java实体类呢?

对方发送的报文

<ns2:response xmlns:ns2="http://service.zxl.cn/test/xml">
	<school>
		<location>长江边上</location>
		<level>初中</level>
		<scale>很大</scale>
	</school >
	<student>
		<height>150cm</height>
		<gender>女校</gender>
        <scale>很多</scale>
	</student>
	<teacher>
		<teacherAttribute id="gender">
			<attributeValue>男的</attributeValue>
		</teacherAttribute>
		<teacherAttribute id="height">
			<attributeValue>177cm</attributeValue>
		</teacherAttribute>
		<teacherAttribute id="age">
			<attributeValue>22岁</attributeValue>
		</teacherAttribute>
	</teacher>
</ns2:response>

在实体类上加上注解

在这里插入图片描述

package com.zxl.bean.xmlStudy;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@Data
@AllArgsConstructor
@NoArgsConstructor

@XmlRootElement(name = "response",namespace="http://service.zxl.cn/test/xml")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class XmlInfo {

    @XmlElement(name = "school")
    private School school;

    @XmlElement(name = "student")
    private Student student;

    @XmlElement(name = "teacher")
    private Teacher teacher;
}

@XmlRootElement 根节点的注解,里面填两个参数,
一个是name,就是根节点的名称,叫做response我们就填response。
一个是namespace,根节点的命名空间,填入xml中后面跟上的url。(不填报错)

@XmlAccessorType(XmlAccessType.FIELD)
将所有属性均绑定在bean上(默认只绑public的属性,加上后绑定所有的)

@XmlElement(name = “school”)
报文分为3部分,将对应的部分名称填上
在这里插入图片描述

package com.zxl.bean.xmlStudy;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@Data
@AllArgsConstructor
@NoArgsConstructor

@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlRootElement(name = "school")
public class School {

    @XmlElement(name = "location")
    private String location;
    @XmlElement(name = "level")
    private String level;
    @XmlElement(name = "scale")
    private String scale;
}

继续填上@XmlRootElement和 @XmlElement注解
在这里插入图片描述

package com.zxl.bean.xmlStudy;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@Data
@AllArgsConstructor
@NoArgsConstructor

@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlRootElement(name = "student")
public class Student {

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

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

    @XmlElement(name = "scale")
    private String scale;
}

继续填上@XmlRootElement和 @XmlElement注解
在这里插入图片描述
这里的id属性,没有单独放出来
我们在建立一个类,单独放id和里面的attributeValue

package com.zxl.bean.xmlStudy;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor

@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlRootElement(name = "teacher")
public class Teacher {

    @XmlElement(name = "teacherAttribute")
    private List<TeacherAttribute> teacherAttributes;
}

package com.zxl.bean.xmlStudy;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.*;

@Data
@AllArgsConstructor
@NoArgsConstructor

@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlRootElement(name = "school")
public class TeacherAttribute {

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

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

}

使用 @XmlAttribute注解,将属性值绑定到id上

解析代码

  private String getXml() throws IOException {
        // 测试xml转bean
        InputStream path = this.getClass().getResourceAsStream("/1.xml");
        BufferedReader reader = new BufferedReader(new InputStreamReader(path,"utf-8"));
        StringBuffer buffer=new StringBuffer();
        String line="";
        while((line=reader.readLine())!=null){
            buffer.append(line);
        }
        reader.close();
        return buffer.toString();
    }

读取xml的方法

    @GetMapping("/testXml2Bean")
    public XmlInfo testXml2Bean() throws IOException, JAXBException {
        String xml = this.getXml();
        StringReader reader = new StringReader(xml);
        JAXBContext jaxbContext = JAXBContext.newInstance(XmlInfo.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        XmlInfo xmlVo = (XmlInfo) jaxbUnmarshaller.unmarshal(reader);

        return xmlVo;
    }

转换方法

测试

在这里插入图片描述
成功转换!
(有问题留言)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pointnet Tutorial

目录 .1 intro-点云特性 1.1 点云特性 1.2 motivation 1.3 pointnet的处理 .2 Pointnet 2.1 contribution 2.2 solution 2.3 backbone 2.4 代码部分 2.5 小结 .4 应用 References .1 intro-点云特性 Q1&#xff1a;什么是点云&#xff1f; 简单来说就是一堆三维点的集…

【异常】前端提示 Support for the experimental syntax ‘jsx‘ isn‘t currently enabled

一、报错内容 17:33:41 - Building for production... 17:34:13 ERROR Failed to compile with 5 errors5:34:09 PM 17:34:13 17:34:13 error in ./src/layout/components/Sidebar/Item.vue?vue&typescript&langjs& 17:34:13 17:34:13 Syntax Error…

万应低代码1月重点更新内容速递

速览版 详情版 一、低代码开发能力提升 01 工作流 &#xff08;1&#xff09; 优化流程推演 在流程发起时&#xff0c;对流程各节点审批人、抄送人进行实时推演。 【使用场景】 ● 以“请假”场景为例&#xff0c;A 角色的固定审批人为“甲、乙、丙” 3 人&#xff0c;在某…

windows10操作系统 显卡MX150 安装CUDA+cuDNN+pytorch

本人水平有限&#xff0c;如有问题请多指正笔记本系统&#xff1a;Windows 10 64位显卡&#xff1a;NVIDIA GeForce MX150显卡驱动程序版本&#xff1a;512.78显卡驱动程序支持CUDA版本&#xff1a;11.6.134及以下安装CUDA&#xff1a;11.6.0安装cuDNN&#xff1a;8.7.0一、安装…

路由器刷机解决学校无线上网问题(小米4A千兆版)

一、准备工作 1、路由器正常联网状态&#xff0c;&#xff08;正常联网状态指的是电脑能够通过路由器上网&#xff09; 2、电脑网线插入路由lan口&#xff0c;IP地址设置为自动获取 3、启动window10的Telent功能 控制面板 -> 程序和功能 -> 左侧“启动或关闭Windows功能…

FormArray在动态表格中的应用

如下图&#xff0c;是这次想要实现的功能。 一个表格行&#xff0c;点击新增按钮就增加一行&#xff0c;点击后面的删除按钮就可以删除对应的行&#xff0c;其中有部分字段需要添加非空校验。要想实现这个功能&#xff0c;需要应用到FormArray的知识。 步骤: 1. 声明一个Form…

打开IE浏览器自动跳转到Edge的解决方法

场景Windows 10中&#xff0c;打开IE浏览器自动跳转到Edge&#xff0c;但是某些网站还是只能在IE中正常访问&#xff0c;Edge访问会出问题。解决方案Edge中点击右上角的三个点&#xff0c;然后点击设置在“默认浏览器”中&#xff0c;修改“让 Internet Explorer 在 Microsoft …

Linux-文件和目录常用命令

1.查看目录内容1.1 终端使用技巧自动补全在敲出 文件/目录/命令的前几个字母之后&#xff0c;按下tab键如果输入的没有歧义&#xff0c;系统会自动补全如果还存在其他文件/目录/命令,再按一下tab键,系统会提示可能存在的命令曾经使用过的命令按上/下光标键可以再曾经使用过的命…

GeoServer系列-安装SqlServer插件

GeoServer 安装包中是不含sqlserver插件的&#xff0c;所以无法创建sqlserver的数据存储&#xff0c;要想支持发布sqlserver的空间表到geoserver就需要添加插件 1&#xff0c;下载插件 官网下载地址&#xff1a;https://geoserver.org/download/ 根据自己的版本下载指定的插件…

Java之并发编程(三)

五、Java 常见并发容器总结 1.ConcurrentHashMap ConcurrentHashMap : 线程安全的 HashMap 1.1 Collections.synchronizedMap() 并发时使用它方法包装HashMap同步&#xff0c;这属于全局锁&#xff0c;性能低下。 1.2 ConcurrentHashMap&#xff0c; 读写操作都能保证很高…

文献阅读-Deep multi-view learning methods: A review

文献阅读-Deep multi-view learning methods: A reviewAbstract1-Introduction1.1 Comparison with Previous Reviews2 Multi-view Learning Methods in The Deep Learning Scope2.1 Multi-view convolutional neural network2.2. Multi-view auto-encoder2.3. Multi-view gene…

杉数求解器

目录前言一、简介以及安装二、COPT交互式命令行工具2-1、普通工具命令2-2、COPT工具命令三、使用示例3-1、交互模式3-2、Windows下终端窗口直接加载四、Python接口4-1、安装4-2、案例分析五、COPT调优工具5-1、介绍5-2、调优工具相关参数六、Python API参考6-1、COPT常数类总结…

【Jetson安装Nomachine】

0. 介绍 Nomachine是一款免费的远程桌面访问应用程序。支持用户从任何地方访问连接到Internet的计算机。该应用程序允许多个用户访问单个PC&#xff0c;且支持使用不同的操作系统。 官网链接&#xff1a;NoMachine - Free Remote Desktop for Everybody 1. 下载Nomachine 软…

【C++】简单理解内联函数

内联函数1.内联函数的概念2.C为什么要有内联函数&#xff1f;3.内联函数展示3.1查看方式3.2 观察汇编代码4.使用内联函数的注意事项5.内联函数缺点和优点1.内联函数的概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有…

九龙证券|沪指收获2010年以来最强1月 北向资金净买入额刷新历史纪录

昨日&#xff0c;A股小幅调整&#xff0c;2023年1月行情随之收官。全体来看&#xff0c;1月A股商场拾级而上&#xff0c;盘面出现普涨格局&#xff0c;价值与生长风格均有亮眼体现。三大股指中&#xff0c;上证指数1月上涨5.39%&#xff0c;创2010年以来最佳局面。深证成指、创…

zookeeper 源码分享二 ----启动加载数据

单机zookeeper 启动加载数据 读取磁盘中快照文件&#xff0c;选择其中第一个能正确加载的文件&#xff0c;最多加载100个快照文件。反序列化快照文件&#xff0c;进行内存DataTree数据加载根据最新事物日志&#xff0c;加载事物日志快照并进行反序列化重新执行事物日志中的操作…

OAuth2流程演示示例

目录一、OAuth2流程演示示例1、创建项目结构①客户②认证服务器③资源拥有者④资源服务器2、流程①资源所有者②客户③客户④认证服务器⑤客户⑥资源服务器一、OAuth2流程演示示例 client 客户 authorization-server 认证服务 resource-owner 资源所有者 resource-server 资源服…

anaconda下载安装,镜像源配置修改及虚拟环境的创建

anaconda安装Anaconda 简介Anaconda 安装1.安装流程2.anaconda 配置修改3. 创建虚拟环境4.常用命令Anaconda 简介 Anaconda&#xff08;官方网站&#xff09;就是可以便捷获取包且对包能够进行管理&#xff0c;同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python…

Cocos Creator游戏项目环境搭建和启动

背景获得了一套cocos creator2.4.2编写的游戏源码&#xff0c;需要在本地启动&#xff0c;查看一下是否符合预期要求。所以需要在本地搭建Cocos Creator环境&#xff0c;因为以前没有接触过&#xff0c;经过一番搜索&#xff0c;终于将环境搭建完成&#xff0c;为了备忘&#x…

【Sciter】Sciter 结合 Preact 封装 图片查看器总结

使用 react 结合 sciter 封装 图片查看器 组件 # 效果图 1、图片:宽度大于高度 2、图片:宽度小于高度 # 如何使用 <div class="container"></div