使用JAXB实现JavaBean与XML互相转换

JAXB 注解列表

注解使用范围描述
@XmlAccessorOrder包、类控制类中字段和属性的顺序。
@XmlAccessorType包、类此注释提供对类中属性和字段的默认序列化的控制。
@XmlRootElement类、枚举将类或枚举类型映射到XML元素。此注释可与以下注释一起使用:XmlType、XmlEnum、XmlAccessorType、XmlAccessorOrder。
@XmlElement字段将JavaBean属性映射到从属性名称派生的XML元素
@XmlElementWrapper字段围绕XML表示生成包装器元素。这主要用于围绕集合生成包装XML元素。此注释可与以下注释一起使用:XmlElement、XmlElements、XmlElementRef、XmlElementRefs、XmlJavaTypeAdapter。
@XmlAttribute字段将JavaBean属性映射到XML属性。
@XmlValue字段将字段或属性映射到 XML 标记上的文本值。

JAXB 注解示例

xml文件根元素的定义

import javax.xml.bind.annotation.*;
import java.io.Serializable;
import java.util.List;@XmlRootElement(name = "Root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root implements Serializable {private static final long serialVersionUID = 1L;@XmlAttribute(name = "id")private String id;@XmlElementWrapper(name = "records")@XmlElement(name = "record")private List<Record> record;public String getId() {return id;}public void setId(String id) {this.id = id;}public List<Record> getRecord() {return record;}public void setRecord(List<Record> record) {this.record = record;}
}

子节点下的类定义

import javax.xml.bind.annotation.XmlElement;
import java.io.Serializable;
import java.util.List;public class Record implements Serializable {private static final long serialVersionUID = 1L;private List<Item> item;public List<Item> getItem() {return item;}@XmlElement(name = "item")public void setItem(List<Item> item) {this.item = item;}
}
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;
import java.io.Serializable;public class Item implements Serializable {private static final long serialVersionUID = 1L;private String id;private String dataType;private String perDataProId;private String value;public String getId() {return id;}@XmlAttribute(name = "id")public void setId(String id) {this.id = id;}public String getDataType() {return dataType;}@XmlAttribute(name = "dataType")public void setDataType(String dataType) {this.dataType = dataType;}public String getPerDataProId() {return perDataProId;}@XmlAttribute(name = "perDataProId")public void setPerDataProId(String perDataProId) {this.perDataProId = perDataProId;}public String getValue() {return value;}@XmlValuepublic void setValue(String value) {this.value = value;}
}

xml数据结构格式

<Root id="Root"><records><record id=""><item id="field1" dataType="java.lang.String" perDataProId="">1</item><item id="field2" dataType="java.lang.String" perDataProId="">2</item><item id="field3" dataType="java.lang.String" perDataProId="">3</item><item id="field4" dataType="java.lang.String" perDataProId="">4</item><item id="field6" dataType="java.lang.String" perDataProId="">6</item><item id="field7" dataType="java.lang.String" perDataProId="">7</item></record></records>
</Root>

javaBean和xml转换工具类


import cn.hutool.json.JSONUtil;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;public class BeanXmlUtils {/*** bean转xml* @param obj 需要转换的对象* @param load 对应的class* @param config isFormat:是否需要格式[默认:false],charSet:字符集[默认:utf-8],xmlHeader:是否需要xml头部[默认:false]**/public static String beanToXml(Object obj, Class<?> load,Object... config) {String xmlStr = null;try {boolean isFormat = false;String charSet = "utf-8";boolean xmlHeader = false;if (config.length>=1){isFormat = (Boolean) config[0];if (config.length>=2){charSet =  (String)config[1];}if (config.length>=3){xmlHeader = (Boolean)config[2];}}JAXBContext context = JAXBContext.newInstance(load);Marshaller marshaller = context.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FRAGMENT, xmlHeader);marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isFormat);marshaller.setProperty(Marshaller.JAXB_ENCODING,charSet);StringWriter writer = new StringWriter();marshaller.marshal(obj, writer);xmlStr = writer.toString();} catch (JAXBException e) {e.printStackTrace();}return xmlStr;}/*** xml转bean* @param str* @param load* @return T**/public  static <T>  T  xmlToBean(String str, Class<T> load) {Object object = null;try {JAXBContext context = JAXBContext.newInstance(load);Unmarshaller unmarshaller = context.createUnmarshaller();object = unmarshaller.unmarshal(new StringReader(str));} catch (JAXBException e) {e.printStackTrace();}return  (T)object;}public static void main(String[] args) {//xmlToBean();beanToXml();}private static void xmlToBean() {String xmlStr = "<Root id=\"Root\">\n" +"<records>\n" +"\t<record id=\"\">\n" +"\t<item id=\"field1\" dataType=\"java.lang.String\" perDataProId=\"\">1</item>\n" +"\t<item id=\"field2\" dataType=\"java.lang.String\" perDataProId=\"\">2</item>\n" +"\t<item id=\"field3\" dataType=\"java.lang.String\" perDataProId=\"\">3</item>\n" +"\t<item id=\"field4\" dataType=\"java.lang.String\" perDataProId=\"\">4</item>\n" +"\t<item id=\"field5\" dataType=\"java.lang.String\" perDataProId=\"\">5</item>\n" +"\t<item id=\"field6\" dataType=\"java.lang.String\" perDataProId=\"\">6</item>\n" +"\t<item id=\"field7\" dataType=\"java.lang.String\" perDataProId=\"\">7</item>\n" +"\t</record>\n" +"</records>\n" +"</Root>";Root root = xmlToBean(xmlStr, Root.class);System.out.println(JSONUtil.toJsonPrettyStr(root));}private static void beanToXml() {Root root = new Root();root.setId("Root");List<Record> records = new ArrayList<>();List<Item> items = new ArrayList<>();Item item = new Item();item.setId("itemCode");item.setDataType("java.lang.String");item.setPerDataProId("");item.setValue("TZ0001");Item item1 = new Item();item1.setId("itemName");item1.setValue("吹风机");items.add(item);items.add(item1);Record record = new Record();record.setItem(items);records.add(record);root.setRecord(records);String xmlStr = beanToXml(root, Root.class, false);System.out.println(xmlStr);}}

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

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

相关文章

踩了一堆坑,终于掌握了postgreSQL主从流的精髓

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

C++:运算符与表达式 (信奥赛练习)

运算符与表达式 1. 运算符基本算术运算符赋值运算符比较运算符逻辑运算符 2. 表达式算术表达式逻辑表达式赋值表达式总结 1. 运算符 运算符是用于执行特定操作的符号。在编程和数学中&#xff0c;运算符是表达式的重要组成部分。它们可以用于执行加减乘除等基本算术运算&#…

vue3中覆盖组件样式的方法

在 Vue 3 中&#xff0c;覆盖组件样式的方法与 Vue 2 相似&#xff0c;但由于 Vue 3 更多地依赖于 CSS 的模块化&#xff0c;一些最佳实践可能会有所不同。以下是一些常用的方法来覆盖 Vue 3 中组件的样式&#xff1a; 1. 内联样式 你可以直接在组件的模板中使用 style 属性来…

三年运维开发你还不会编写k8s的资源清单yaml???速度进来学!

三年运维开发你还不会编写k8s的资源清单yaml&#xff1f;&#xff1f;&#xff1f;速度进来学&#xff01; 在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;YAML文件是用于描述集群资源&#xff08;如Pod、Service、Deployment等&#xff09;的常用方式。通过编写和操…

gerrit 拉取失败

在浏览器gerrit的设置界面设置的邮箱地址和在命令行使用git config --gloable user.email设置的邮箱地址必须保持一致吗 在浏览器gerrit的设置界面设置的邮箱地址和在命令行使用git config --global user.email设置的邮箱地址并不一定需要保持一致。这两个邮箱地址是独立的&am…

【数据结构】4.List的介绍

目录 1.什么是List 2.常见接口介绍 3.List的使用 1.什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下&#xff1a; Iterable也是一个接口…

syscall的检测与绕过(下)

syscall的检测与绕过 ntdll中syscall被执行的格式大致 我们可以通过检测mov r10, rcx类似的代码来确定程序是否直接进行系统调用。 但是很容易被bypass 而且还可以写出很多不一样的写法&#xff0c;显然这个方式是不行的。很轻易就会被bypass。 当然也可以检测syscall指令&a…

UDTF函数 explode

场景&#xff1a; 原hive数据形式 split 处理到一个Array 形式 使用explode炸开后的效果是 explode结合侧面视图达到targeType 目标形式&#xff1a; 一进多出 explode 将hive 中复杂的 array 炸成多行 因为炸开后&#xff0c; movie 列值少于categoryname 列所以这里为了达到…

朴素模式匹配算法

什么是字符串的模式匹配&#xff1f; 字符串模式匹配:在主串中找到与模式串相同的字串&#xff0c;并返回其所在位置 算法思想&#xff1a; 算法思想为:从主串S的第一个字符起&#xff0c;与模式串T的第一个字符比较,若相等&#xff0c;则继续逐个比较后续字符;否则从主串的下一…

Windows环境下删除MySQL

文章目录 一、关闭MySQL服务1、winR打开运行&#xff0c;输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录&#xff08;默认在C盘下的Program …

多线程代码案例之阻塞队列

目录 1.生产者消费者模型 2.使用标准库中的阻塞队列 3.模拟实现阻塞队列 在介绍阻塞队列之前&#xff0c;会先介绍一些前置知识&#xff0c;像队列&#xff1a;有普通队列、优先级队列、阻塞队列、和消息队列。前面两个是线程不安全的&#xff0c;而后面两个是线程安全的。本…

前端如何单独做虚拟奖金池?

公司业务需求要做一个虚拟奖金池&#xff0c;具体是需求是&#xff0c;不需要后端数据支持&#xff0c;但是又需要不同用户看到的奖金池数据每次变动都是一致的&#xff0c;并且要在给定的最小最大值中变动。 一开始看需求&#xff0c;因为需要所有登录/未登录&#xff0c;不同…

全栈的自我修养 ———— react实现滑动验证

实现滑动验证 展示依赖实现不借助create-puzzle借助create-puzzle 展示 依赖 npm install rc-slider-captcha npm install create-puzzleapi地址 实现 不借助create-puzzle 需要准备两张图片一个是核验图形&#xff0c;一个是原图------> 这个方法小编试了后感觉比较麻烦…

【七 (1)FineBI FCP模拟试卷-股票收盘价分析】

目录 文章导航一、字段解释二、需求三、操作步骤1、添加计算字段&#xff08;每月最后一天的收盘价&#xff09;2、绘制折线图 文章导航 【一 简明数据分析进阶路径介绍&#xff08;文章导航&#xff09;】 一、字段解释 Company Name&#xff1a;公司名称 Date&#xff1a;…

【vue】绑定事件 v-on

v-on 简写&#xff1a; clickkeyupkeydownkeyup.wkeyup.ctrl.a <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

今天掏心窝子!聊聊35岁了程序员何去何从?

今天的内容不聊技术&#xff0c;聊聊轻松的话题&#xff0c;脑子高速转了好几周&#xff0c;停下来思考一下人生…… 不对&#xff0c;关于35岁的问题好像也不轻松&#xff0c;些许有点沉重&#xff0c;反正不是技术&#xff0c;不用高速转动脑细胞了&#xff0c;哈哈。 兄弟…

策略模式【行为模式C++】

1.概述 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 策略模式通常应用于需要多种算法进行操作的场景&#xff0c;如排序、搜索、数据压缩等。在这些情况下&#x…

厨房安全监控系统设计方案

厨房安全监控系统设计方案 一、系统架构 厨房安全监控系统的架构主要分为感知层、网络层、平台层和应用层四个层次。 感知层&#xff1a;通过各种传感器实时采集厨房环境数据。网络层&#xff1a;负责数据的传输&#xff0c;将感知层采集的数据传输到平台层。平台层&#xf…

Pandas相比Excel的优势是哪些?

熟悉Pandas的同学会知道&#xff0c;Pandas相当于Python中的Excel&#xff0c;都是基于二维表的进行数据处理分析&#xff0c;不同的是&#xff0c;Pandas基于代码操作数据&#xff0c;Excel是图形化的分析工具。 不少人会问Excel比Pandas更简单&#xff0c;为什么还要学习Pan…

wangEditor 测试环境对,但是生产环境无法显示

package.json 文件版本 "wangeditor": "4.3.0"开发环境 new Editor(#${this.id});出来的数据 正式环境 new Editor(#${this.id});出来的数据 原因&#xff1a; vue.config 文件 打包策略的时候 const assetsCDN {css: [https://lf6-cdn-tos.bytecd…