当前位置: 代码网 > it编程>编程语言>Java > 浅析如何使用xstream实现javaBean与xml互转

浅析如何使用xstream实现javaBean与xml互转

2025年05月04日 Java 我要评论
xstream 是一个用于将 java 对象与 xml 之间进行转换的库。它非常简单易用,适用于快速开发和原型设计。下面将详细介绍如何使用 xstream 实现 javabean 与 xml 之间的互

xstream 是一个用于将 java 对象与 xml 之间进行转换的库。它非常简单易用,适用于快速开发和原型设计。下面将详细介绍如何使用 xstream 实现 javabean 与 xml 之间的互转,并提供具体的代码示例。

1. 引入依赖

首先,确保在项目中引入了 xstream 的依赖。如果使用的是 maven 构建工具,可以在项目的 pom.xml 文件中添加如下依赖:

<dependency>
    <groupid>com.thoughtworks.xstream</groupid>
    <artifactid>xstream</artifactid>
    <version>1.4.19</version> <!-- 检查是否有更新版本 -->
</dependency>

2. 定义 javabean

假设有一个简单的 person 类,包含姓名、年龄和地址信息:

public class person {
    private string name;
    private int age;
    private address address;
 
    // getters and setters
 
    @override
    public string tostring() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
 
    public static class address {
        private string street;
        private string city;
        private string state;
 
        // getters and setters
 
        @override
        public string tostring() {
            return "address{" +
                    "street='" + street + '\'' +
                    ", city='" + city + '\'' +
                    ", state='" + state + '\'' +
                    '}';
        }
    }
}

3. javabean 转 xml

使用 xstream 将 person 对象转换为 xml 字符串:

import com.thoughtworks.xstream.xstream;
 
public class javabeantoxmlexample {
    public static void main(string[] args) {
        // 创建 person 对象
        person.address address = new person.address();
        address.setstreet("123 main st");
        address.setcity("anytown");
        address.setstate("anystate");
 
        person person = new person();
        person.setname("john doe");
        person.setage(30);
        person.setaddress(address);
 
        // 创建 xstream 实例
        xstream xstream = new xstream();
 
        // 将 javabean 转换为 xml
        string xml = xstream.toxml(person);
 
        // 输出 xml
        system.out.println(xml);
    }
}

4. xml 转 javabean

使用 xstream 将 xml 字符串转换为 person 对象:

import com.thoughtworks.xstream.xstream;
 
public class xmltojavabeanexample {
    public static void main(string[] args) {
        // xml 字符串
        string xml = "<person>\n" +
                     "  <name>john doe</name>\n" +
                     "  <age>30</age>\n" +
                     "  <address>\n" +
                     "    <street>123 main st</street>\n" +
                     "    <city>anytown</city>\n" +
                     "    <state>anystate</state>\n" +
                     "  </address>\n" +
                     "</person>";
 
        // 创建 xstream 实例
        xstream xstream = new xstream();
 
        // 将 xml 转换为 javabean
        person person = (person) xstream.fromxml(xml);
 
        // 输出 javabean
        system.out.println(person);
    }
}

5. 自定义标签名称

默认情况下,xstream 会使用类名和字段名作为 xml 标签名称。如果想自定义标签名称,可以使用注解或配置方法。

使用注解

import com.thoughtworks.xstream.annotations.xstreamalias;
 
@xstreamalias("person")
public class person {
    @xstreamalias("full-name")
    private string name;
    @xstreamalias("age-in-years")
    private int age;
    @xstreamalias("address-info")
    private address address;
 
    // getters and setters
 
    @override
    public string tostring() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
 
    @xstreamalias("address")
    public static class address {
        @xstreamalias("street-address")
        private string street;
        @xstreamalias("city-name")
        private string city;
        @xstreamalias("state-code")
        private string state;
 
        // getters and setters
 
        @override
        public string tostring() {
            return "address{" +
                    "street='" + street + '\'' +
                    ", city='" + city + '\'' +
                    ", state='" + state + '\'' +
                    '}';
        }
    }
}

使用配置方法

import com.thoughtworks.xstream.xstream;
 
public class customtagexample {
    public static void main(string[] args) {
        // 创建 person 对象
        person.address address = new person.address();
        address.setstreet("123 main st");
        address.setcity("anytown");
        address.setstate("anystate");
 
        person person = new person();
        person.setname("john doe");
        person.setage(30);
        person.setaddress(address);
 
        // 创建 xstream 实例
        xstream xstream = new xstream();
 
        // 配置自定义标签名称
        xstream.alias("person", person.class);
        xstream.alias("address", person.address.class);
        xstream.aliasfield("full-name", person.class, "name");
        xstream.aliasfield("age-in-years", person.class, "age");
        xstream.aliasfield("address-info", person.class, "address");
        xstream.aliasfield("street-address", person.address.class, "street");
        xstream.aliasfield("city-name", person.address.class, "city");
        xstream.aliasfield("state-code", person.address.class, "state");
 
        // 将 javabean 转换为 xml
        string xml = xstream.toxml(person);
 
        // 输出 xml
        system.out.println(xml);
    }
}

知识延展

使用xstream实现对象与xml互相转换

依赖

       <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.aircas.util;
 
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);
            xstream.alias(clazz.getsimplename(), clazz); // 为目标类定义别名
            return (t) xstream.fromxml(xml); // 直接从 xml 字符串转换
        } 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>

总结

javabean 转 xml:使用 xstream 的 toxml 方法将 java 对象转换为 xml 字符串。

xml 转 javabean:使用 xstream 的 fromxml 方法将 xml 字符串转换为 java 对象。

自定义标签名称:可以使用注解或配置方法来自定义 xml 标签名称。

以上就是浅析如何使用xstream实现javabean与xml互转的详细内容,更多关于javabean与xml互转的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com