xstream实现xml和java bean 互相转换

目录

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

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下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 图形界面配置RAID

目录 RAID 1 配置 RAID 5配置 , RAID 配置起来要比 LVM 方便&#xff0c;因为它不像 LVM 那样分了物理卷、卷组和逻辑卷三层&#xff0c;而且每层都需要配置。我们在图形安装界面中配置 RAID 1和 RAID 5&#xff0c;先来看看 RAID 1 的配置方法。 RAID 1 配置 配置 RAID 1…

开源项目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自带工具&…

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

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

使用geek卸载windows软件,干净彻底

我们在电脑上安装软件&#xff0c;以及在使用软件的过程中&#xff0c;会产生一些程序文件、注册表项和临时文件等&#xff0c;用来支持软件的正常使用&#xff0c;都是正常现象。 但是&#xff0c;在卸载软件时&#xff0c;很多软件的卸载程序&#xff0c;并不能完全清除软件…

excel中正态分布函数NORM.DIST和NORMDIST,以及它们之间的区别

NORM.DIST和NORMDIST的区别 NORM.DIST和NORMDIST函数都可以返回正态分布的概率密度、或者正态累积分布。 根据微软官网上的说法&#xff0c;NORMDIST函数已经不建议使用了&#xff0c;它已经被一个或者几个新的函数代替&#xff08;例如NORM.DIST&#xff09;&#xff0c;这些…

RabbitMQ-高级篇-黑马程序员

代码&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1nQBIgB_SbzoKu_XMWZ3JoA?pwdaeoe 提取码&#xff1a;aeoe 在昨天的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但…

Python数据结构:集合(set)详解

1.集合的概念 在Python中&#xff0c;集合&#xff08;Set&#xff09;是一种无序、不重复的数据类型&#xff0c;它的实现基于哈希表&#xff0c;是由唯一元素组成的。集合中不允许有重复的元素&#xff0c;即相同元素只能出现一次。Python中的集合类似于数学中的集合&#xf…

你是想被ChatGPT改变,还是改变软件开发的未来?丨IDCF

人工智能技术的发展&#xff0c;正在深刻地改变着我们的生活和工作方式。在软件工程领域&#xff0c;ChatGPT作为一种新兴的人工智能技术&#xff0c;正在逐渐地被应用到软件开发的各个环节中。那么&#xff0c;ChatGPT对每个人的影响是什么呢&#xff1f; 一、对软件开发人员…

LockBit3.0的字符串解密方法

LockBit 与大多数勒索黑客团体一样以勒索软件即服务 (RaaS) 模式运行,该组织于 2019 年 9 月首次被观察到,此后发展为了今年最主要的勒索软件团伙,甚至超过了Conti、Hive等其他知名团体。据泄露数据站点的数据统计表明,LockBit占2022年第一季度所有与勒索软件相关的泄露事件…

使用Pandas进行数据读写的简易教程

Pandas是一个功能强大且广泛使用的Python库。它提供了一种简单而灵活的方式来读取和写入各种数据格式&#xff0c;包括CSV、Excel、SQL数据库等。本文将介绍如何使用Pandas进行数据的读取和写入操作&#xff0c;帮助你快速上手并高效地处理数据。 一、安装和导入pandas 首先&…

NovelD: A Simple yet Effective Exploration Criterion论文笔记

NovelD:一种简单而有效的探索准则 1、Motivation 针对稀疏奖励环境下的智能体探索问题&#xff0c;许多工作中采用各种内在奖励(Intrinsic Reward)设计来指导困难探索环境中的探索 &#xff0c;例如&#xff1a; ICM&#xff1a;基于前向动力学模型的好奇心驱动探索RND&…

【LeetCode】每日一题 2023_11_15 K 个元素的最大和(脑筋急转弯+数学)

文章目录 刷题前唠嗑K 个元素的最大和题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 首先声明一点啊&#xff0c;这个脑筋急转弯的题目标签可不是我想的啊&#xff0c;这个是 LeetCode 官方给这道题标注的啊 K 个元素的最大和…

spring cloud alibaba之nacos

spring cloud nacos 安装和启动nacos # 解压nacos安装包 # tar -zvxf nacos-server-1.4.1.tar.gz# nacos默认是以集群的模式启动&#xff0c;此处先用单机模式 # cd /usr/local/mysoft/nacos/bin # sh startup.sh -m standalone# nacos 日志 # tail -f /usr/local/mysoft/na…

国产企业级低代码开发哪个最好?这一款超好用

低代码开发平台&#xff08;Low-code Development Platform&#xff09;正在迅速崛起&#xff0c;成为未来软件技术发展的主导趋势。通过使用低代码开发平台&#xff0c;企业能够显著提高开发效率&#xff0c;降低对专业开发人员的依赖&#xff0c;并实现更快速的软件交付和使用…

PC6410 DC-DC降压调整器低纹波高效率低功耗

PC6410是一款由基准电压源、振荡电路、比较器、PWM/PFM 控制电路等构成的CMOS降压DC/DC调整器。利用PWM/PFM自动切换控制电路达到可调占空比&#xff0c;具有全输入电压范围内的低纹波、高效率和大输出电流等特点。PC6410内置功率MOSFET&#xff0c;使用过压、过流、过热、短路…

高防IP是什么?如何隐藏源站IP?如何进行防护?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下,推出的付费增值服务。用户在数据不转移的情况下,就可以通过配置高防IP , 将攻击流量引流到高防|P,确保源站的稳定可靠。高防IP采用的技术手段包括DDoS防护、WAF ( Web应用程序防火墙)等,它能够有效抵御来…

印刷企业使用数字工厂管理系统前后有什么变化

随着科技的飞速发展&#xff0c;数字工厂管理系统已经逐渐渗透到印刷企业的各个环节。本文将通过分析印刷企业在使用数字工厂管理系统前后的变化&#xff0c;探讨这一技术如何为印刷行业带来革新。 一、使用前的状况 在使用数字工厂管理系统之前&#xff0c;印刷企业的生产方式…

(四)、MySQL查询优化

《高性能MySQL》第三版&#xff0c;第六章学习笔记 一、优化数据的访问 查询性能低下最基本的原因是访问的数据太多。可以通过下列两个步骤进行分析&#xff1a; 1、确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行&#xff0c;但雨哦时候也可能访问了…

element ui + echarts点击表格显示对应的图形

一、vue封装饼图、树状图、雷达图等组件 目录 resize.js需要utils.js utils.js import { parseTime } from ./yunhis/*** 表格时间格式化*/ export function formatDate(cellValue) {if (cellValue null || cellValue "") return "";var date new Da…