xstream实现xml和java bean 互相转换

news2024/11/17 23:54:06

目录

  • pom引用
  • java bean 类
  • XML 转换工具类
  • 测试类
  • 执行结果
  • 注意问题

JAXB方式见:
JAXB实现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文档相互转换。

这里介绍一下 XStream。

pom引用

		<dependency>
			<groupId>com.thoughtworks.xstream</groupId>
			<artifactId>xstream</artifactId>
			<version>1.4.20</version>
		</dependency>

java bean 类

import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.ToString;

import java.util.List;

@Data
@ToString
@XStreamAlias("person")
public class Person {

    private String name;
    private int age;

    private List<String> hobbies;

    private List<Person> family;

}

XML 转换工具类

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.security.AnyTypePermission;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class XMLUtil {
    private XMLUtil() {
    }

    public static Object convertFromXML(Class<?> clazz, String xml) {

        XStream xStream = new XStream(new DomDriver());
        // 避免 com.thoughtworks.xstream.security.ForbiddenClassException异常
        xStream.addPermission(AnyTypePermission.ANY);
        // 处理注解
        xStream.processAnnotations(clazz);
        // 将XML字符串转为bean对象
        return xStream.fromXML(xml);
    }

    public static String convertToXml(Object obj) {
        XStream xs = new XStream(new DomDriver());
        xs.processAnnotations(obj.getClass());
        return xs.toXML(obj);
    }
}

测试类

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import will.tools.model.Person;
import will.tools.util.XMLUtil;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
public class XMLUtilTests {
    @Test
    public void test() {
        Person p2 = getPerson();
        String xml = XMLUtil.convertToXml(p2);
        System.out.println("对象转xml");
        System.out.println(xml);

//        String xml =
//
//                "<person>\n" +
//                "  <name>黄蓉</name>\n" +
//                "  <age>18</age>\n" +
//                "  <hobbies>\n" +
//                "    <string>sing</string>\n" +
//                "    <string>dance</string>\n" +
//                "  </hobbies>\n" +
//                "  <family>\n" +
//                "    <person>\n" +
//                "      <name>郭靖</name>\n" +
//                "      <age>20</age>\n" +
//                "      <hobbies>\n" +
//                "        <string>射箭</string>\n" +
//                "        <string>爬山</string>\n" +
//                "      </hobbies>\n" +
//                "    </person>\n" +
//                "  </family>\n" +
//                "</person>";

        Person p = (Person) XMLUtil.convertFromXML(Person.class, xml);
        System.out.println("xml转对象");
        System.out.println(p.toString());
    }

    private static Person getPerson() {
        Person p1 = new Person();
        p1.setAge(20);
        p1.setName("郭靖");
        List<String> lst = new ArrayList<>();
        lst.add("射箭");
        lst.add("爬山");
        p1.setHobbies(lst);

        Person p2 = new Person();
        p2.setAge(18);
        p2.setName("黄蓉");
        List<String> hobbyList = new ArrayList<>();
        hobbyList.add("sing");
        hobbyList.add("dance");
        p2.setHobbies(hobbyList);

        List<Person> list = new ArrayList<>();
        list.add(p1);
        p2.setFamily(list);
        return p2;
    }
}

执行结果

对象转xml
<person>
  <name>黄蓉</name>
  <age>18</age>
  <hobbies>
    <string>sing</string>
    <string>dance</string>
  </hobbies>
  <family>
    <person>
      <name>郭靖</name>
      <age>20</age>
      <hobbies>
        <string>射箭</string>
        <string>爬山</string>
      </hobbies>
    </person>
  </family>
</person>

xml转对象

Person(name=黄蓉, age=18, hobbies=[sing, dance], family=[Person(name=郭靖, age=20, hobbies=[射箭, 爬山], family=null)])

注意问题

1、xml转bean时报错:com.thoughtworks.xstream.security.ForbiddenClassException: will.tools.model.Person

解决方法:
增加 该属性设置:xStream.addPermission(AnyTypePermission.ANY);
代码中已增加。
2、bean转换xml时,转换为类名
<will.tools.model.Person>


</will.tools.model.Person>

使用别名
在这里插入图片描述

XMLUtil源文件下载 无需积分:

XMLUtil下载

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

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

相关文章

优化了

v2.0.2版本在 github 发布了。 ## 优化的功能 优化(定时任务): 测试计划与定时任务模块进行了合并&#xff0c;极大的简化了操作步聚。 1、前端页面&#xff0c;测试计划plan&#xff0c;加入1个接口&#xff0c;设置每分钟运行1次。 2、开启定时任务服务&#xff0c;后台日志 …

微信小程序H5 uniapp

最近微信小程序对有视频播放的审核严&#xff0c;需要提供“文娱类资质”。而申请这个资质比较繁琐。所以我们在小程序上用web-view做跳转到H5&#xff0c;H5使用uniapp编写。这是小程序关于web-view文档说明。https://developers.weixin.qq.com/miniprogram/dev/component/web…

NI MIMO原型验证系统硬件介绍 已更新 2023年1月6日

https://www.ni.com/zh-cn/shop/wireless-design-test/what-is-the-mimo-prototyping-system/introduction-to-the-ni-mimo-prototyping-system-hardware.html 概览 随着采用无线连接方式的设备大量涌现&#xff0c;迫切需要研发可满足更高数据与容量需求的无线技术。来势汹汹…

抖音直播招聘报白企业人力资源有招聘需求的看过来

人力资源行业抖音招聘报白开始了&#xff0c;但是目前的市面的价格不一&#xff0c;很多人力资源公司最近想做抖音的直播报白&#xff0c;做直播待岗&#xff0c;因为最近刚好是招聘高峰期啊&#xff0c;企业需求大&#xff0c;赶上这一波&#xff0c;但是对目前市面上做抖音报…

力扣每日一题-K个元素的最大和-2023.11.15

力扣每日一题&#xff1a;K个元素的最大和 题目链接:2656.K个元素的最大和 题目描述 代码思路 题目看完直接笑嘻了&#xff0c;还有这么容易的题。由题可知&#xff0c;第一次要找出最大值m&#xff0c;那由于把m1放回去&#xff0c;那第二次找的就是m1&#xff0c;以此类推…

seatunnel及web安装常见问题与解决方法

mvn加速下载seatunnel相关jar包 安装seatunnel过程中&#xff0c;解压文件后官方默认提供的connector的jar包只有2个&#xff0c;要想连接mysql&#xff0c;oracle&#xff0c;SqlServer&#xff0c;hive&#xff0c;kafka&#xff0c;clickhouse&#xff0c;doris等时&#x…

问题 H: 棋盘游戏(二分图变式)

题意&#xff1a;要求找到 不放车就无法达到最大数的点 的个数 题解&#xff1a;1.以行列绘制二分图 2.先算出最大二分匹配数 3.依次遍历所有边 删除该边&#xff0c;并计算二分匹配最大值 &#xff08;若小于原最大值即为重要点&#xff09;&#xff0…

安装selenium(超级详细)

selenium本身是一个自动化测试工具&#xff0c;它可以让python代码调用浏览器&#xff0c;并获取到浏览器中加载的各种资源&#xff0c;我们可以利用selenium提供的各项功能&#xff0c; 帮助我们完成数据的抓取。 1、在PyCharm中安装selenium 点击PyCharm界面的下方Terminal…

开源项目datavines内存泄漏问题分析

应用程序开启JMX java -Dspring.profiles.activemysql -Dcom.sun.management.jmxremote.port1099 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -Djava.rmi.server.hostname127.0.0.1 -jar dataVines.jar 通过jdk自带工具&…

探索SOLIDWORKS 3DE云平台:产品数据管理与协作的新时代

SOLIDWORKS 3DE云平台为企业提供了基于云端的全方位解决方案&#xff0c;涵盖了产品设计、仿真验证、制造与生产、市场与营销、数据管理和生命周期等领域。通过这一平台&#xff0c;企业能够将创意转化为现实所需的一切资源。同时&#xff0c;3DE云平台还帮助企业摆脱了IT限制&…

类属性修改(为什么python类不具备被赋值能力?)

为什么python类不具备被赋值能力&#xff1f;&#xff0c;用魔术方法收集实参&#xff0c;在类中可以定义方法处理实际参数&#xff0c;实现对类“赋值”。 (笔记模板由python脚本于2023年11月15日 12:45:27创建&#xff0c;本篇笔记适合初通Python类class的coder翻阅) 【学习的…

数据结构第四课 -----线性表之队列

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

高性能架构设计

1. 引言 高性能架构设计在现代系统中至关重要&#xff0c;它能够应对大规模的数据和用户需求增长&#xff0c;提供优秀的用户体验和实时数据处理能力。同时&#xff0c;它也是解决"三高"问题&#xff08;高并发、高性能、高可用性&#xff09;的关键。 2. 高性能定…

三维模型的顶层合并构建的点云抽稀关键技术分析

三维模型的顶层合并构建的点云抽稀关键技术分析 倾斜摄影超大场景的三维模型的顶层合并通常会生成大量的点云数据&#xff0c;这对于后续处理和应用可能会带来一些挑战。为了减少数据存储和处理的复杂性&#xff0c;可以采用点云抽稀处理技术来降低点云密度和数据量。本文将对几…

weblogic多机集群节点管理服务配置

1.安装启动管理端控制台略过了&#xff0c;登录到控制台&#xff0c; 2.创建集群&#xff0c;配置信息如图&#xff0c;基本默认就行&#xff0c;点完成。点击集群名称&#xff0c;添加服务器 前两个是管理机上的两个服务&#xff0c;后面是另个一个机器的两个节点服务&#…

sql查询结果跟in传入参数顺序一致

Orcle、postgresql、td-sql中可以使用如下语句 select namefrom tbl_user_infowhere id in (4,3,1)order by instr(4,3,1,id);查询结果&#xff1a;

node将package.json中的包降为低版本或者升级为高版本

前言 比如现在你用某个包的当前版本&#xff0c;但是你安装的版本高了&#xff0c;那么你应该这么做 1.首先删除node项目中的node_modules目录&#xff0c;防止安装时的包不一致 如果没安装就忽略 例如将package.json中的view-design包降为^4.6.1,当前view-design的版本为^4.…

基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统

文/朱季谦 环境准备&#xff1a;安装Gin与Gorm 本文搭建准备环境&#xff1a;GinGormMySql。 Gin是Go语言的一套WEB框架&#xff0c;在学习一种陌生语言的陌生框架&#xff0c;最好的方式&#xff0c;就是用我们熟悉的思维去学。作为一名后端Java开发&#xff0c;在最初入门…

优思学院|一文快速看懂TRIZ原理

在创新领域&#xff0c;TRIZ被翻译为发明问题的解决理论。TRIZ理论深刻揭示了创造发明的内在规律和原理&#xff0c;专注于澄清和强调系统中存在的矛盾&#xff0c;旨在完全解决这些矛盾&#xff0c;实现最终的理想解决方案。实践证明&#xff0c;运用TRIZ理论不仅能够极大地加…

BUUCTF 面具下的flag 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;得到一张.jpg图片。 密文&#xff1a; 解题思路&#xff1a; 1、将图片放到Kali中&#xff0c;使用binwalk检测出隐藏zip包。 使用foremost提取zip压缩包到output目录下 解压zip压缩包&…