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互转的资料请关注代码网其它相关文章!
发表评论