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