当前位置: 首页 > article >正文

Java对象与XML互相转换(xstream)

 依赖

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

实体类

package com.itheima.util;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private int age;
}

工具类

package com.itheima.one;

import com.thoughtworks.xstream.XStream;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class XmlUtils {

    private static final XStream xStream = new XStream();

    static {
        // 允许反序列化
        xStream.allowTypesByWildcard(new String[] { "**" });
    }

    /**
     * 将 Java 对象转换为 XML,并写入指定文件
     *
     * @param <T>     要转换的 Java 对象类型
     * @param object  要转换的 Java 对象
     * @param filePath 输出的 XML 文件路径
     */
    public static <T> void objectToXml(T object, String filePath) {
        // 为对象定义 XML 别名
        xStream.alias(object.getClass().getSimpleName(), object.getClass());

        StringWriter stringWriter = new StringWriter();
        stringWriter.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");

        // 将对象转为 XML 字符串
        xStream.toXML(object, stringWriter);

        // 获取文件路径
        Path path = Paths.get(filePath);

        // 使用 NIO 的 BufferedWriter 将 XML 字符串写入文件
        try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
            writer.write(stringWriter.toString());
            System.out.println("XML 内容已成功写入到文件:" + path.toString());
        } catch (IOException e) {
            System.err.println("写入 XML 文件时发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 从 XML 文件中读取数据并转换为 Java 对象
     *
     * @param filePath XML 文件路径
     * @param clazz    要转换为的 Java 类
     * @param <T>      转换后的对象类型
     * @return 转换后的 Java 对象,如果读取或转换失败则返回 null
     */
    public static <T> T xmlToObject(String filePath, Class<T> clazz) {
        Path path = Paths.get(filePath);

        // 验证文件是否存在
        if (!Files.exists(path)) {
            System.err.println("指定的文件不存在: " + filePath);
            return null;
        }

        try {
            String xml = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
            return (T) xStream.fromXML(xml, clazz);
        } catch (IOException e) {
            System.err.println("读取 XML 文件时发生错误: " + e.getMessage());
            e.printStackTrace();
        } catch (ClassCastException e) {
            System.err.println("转换 XML 数据时发生错误: " + e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
}

测试

package com.itheima.one;

import com.itheima.one.XmlUtils;
import com.itheima.util.Person;

public class Main {
    public static void main(String[] args) {
        // 假设有一个对象 person,你需要将其转换为 XML
        Person person = new Person("John", 30);
        String filePath = "D:/Desktop/person.xml";

        // 调用静态方法将对象转换为 XML 并写入文件
        XmlUtils.objectToXml(person, filePath);

        // 从 XML 文件中读取并转换为对象
        Person readPerson = XmlUtils.xmlToObject(filePath, Person.class);
        System.out.println(readPerson);
    }
}

输出结果:

XML 内容已成功写入到文件:D:\Desktop\person.xml
Person(name=John, age=30)
D:/Desktop/person.xml文件内容: 
<?xml version="1.0" encoding="UTF-8"?>
<Person>
  <name>John</name>
  <age>30</age>
</Person>


http://www.kler.cn/a/413766.html

相关文章:

  • 【鸿蒙】鸿蒙开发过程中this指向问题
  • 非线性控制器设计原理
  • android 安全sdk相关
  • 易速鲜花聊天客服机器人的开发(下)
  • Paddle Inference部署推理(八)
  • d3-contour 生成等高线图
  • 本地化部署 私有化大语言模型
  • ABAP OOALV模板
  • Android中ByteBuffer内存池设计示例
  • 23种设计模式之外观模式
  • linux添加附加磁盘
  • CFD 在生物反应器放大过程中的作用
  • 拍立淘按图搜索实战化,拍立淘API接口参数说明
  • 在 Ubuntu 上部署 MediaWiki 开源维基平台
  • Jetpack业务架构(ViewModel)
  • Linux系统之iotop命令的基本使用
  • 【EI会议征稿通知 | 往届均已见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)
  • 分类预测 | Matlab实现GA-XGBoost分类预测
  • 使用Eureka实现服务注册与发现的具体案例详解
  • go语言怎么实现bash cmd里的mv功能?
  • 【GPT】力量训练是什么,必要吗,有可以替代的方式吗
  • 11.25 Scala案例
  • web3.js + Ganache 模拟以太坊账户间转账
  • Ubuntu 硬盘分区并挂载
  • 【项目日记】仿mudou的高并发服务器 --- 实现基础高并发服务器基础模块
  • 【LeetCode面试150】——56合并区间