淺析如何使用xstream實(shí)現(xiàn)javaBean與xml互轉(zhuǎn)
XStream 是一個用于將 Java 對象與 XML 之間進(jìn)行轉(zhuǎn)換的庫。它非常簡單易用,適用于快速開發(fā)和原型設(shè)計。下面將詳細(xì)介紹如何使用 XStream 實(shí)現(xiàn) JavaBean 與 XML 之間的互轉(zhuǎn),并提供具體的代碼示例。
1. 引入依賴
首先,確保在項(xiàng)目中引入了 XStream 的依賴。如果使用的是 Maven 構(gòu)建工具,可以在項(xiàng)目的 pom.xml 文件中添加如下依賴:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.19</version> <!-- 檢查是否有更新版本 -->
</dependency>
2. 定義 JavaBean
假設(shè)有一個簡單的 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 轉(zhuǎn) XML
使用 XStream 將 Person 對象轉(zhuǎn)換為 XML 字符串:
import com.thoughtworks.xstream.XStream;
public class JavaBeanToXmlExample {
public static void main(String[] args) {
// 創(chuàng)建 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);
// 創(chuàng)建 XStream 實(shí)例
XStream xstream = new XStream();
// 將 JavaBean 轉(zhuǎn)換為 XML
String xml = xstream.toXML(person);
// 輸出 XML
System.out.println(xml);
}
}4. XML 轉(zhuǎn) JavaBean
使用 XStream 將 XML 字符串轉(zhuǎn)換為 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>";
// 創(chuàng)建 XStream 實(shí)例
XStream xstream = new XStream();
// 將 XML 轉(zhuǎn)換為 JavaBean
Person person = (Person) xstream.fromXML(xml);
// 輸出 JavaBean
System.out.println(person);
}
}5. 自定義標(biāo)簽名稱
默認(rèn)情況下,XStream 會使用類名和字段名作為 XML 標(biāo)簽名稱。如果想自定義標(biāo)簽名稱,可以使用注解或配置方法。
使用注解
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) {
// 創(chuàng)建 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);
// 創(chuàng)建 XStream 實(shí)例
XStream xstream = new XStream();
// 配置自定義標(biāo)簽名稱
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 轉(zhuǎn)換為 XML
String xml = xstream.toXML(person);
// 輸出 XML
System.out.println(xml);
}
}知識延展
使用xstream實(shí)現(xiàn)對象與XML互相轉(zhuǎn)換
依賴
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.18</version>
</dependency>
實(shí)體類
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 對象轉(zhuǎn)換為 XML,并寫入指定文件。
*
* @param <T> 要轉(zhuǎn)換的 Java 對象類型
* @param object 要轉(zhuǎn)換的 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");
// 將對象轉(zhuǎ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 內(nèi)容已成功寫入到文件:" + path.toString());
} catch (IOException e) {
System.err.println("寫入 XML 文件時發(fā)生錯誤: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 從 XML 文件中讀取數(shù)據(jù)并轉(zhuǎn)換為 Java 對象。
*
* @param filePath XML 文件路徑
* @param clazz 要轉(zhuǎn)換為的 Java 類
* @param <T> 轉(zhuǎn)換后的對象類型
* @return 轉(zhuǎn)換后的 Java 對象,如果讀取或轉(zhuǎn)換失敗則返回 null
*/
public static <T> T xmlToObject(String filePath, Class<T> clazz) {
Path path = Paths.get(filePath);
// 驗(yàn)證文件是否存在
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); // 為目標(biāo)類定義別名
return (T) xStream.fromXML(xml); // 直接從 XML 字符串轉(zhuǎn)換
} catch (IOException e) {
System.err.println("讀取 XML 文件時發(fā)生錯誤: " + e.getMessage());
e.printStackTrace();
} catch (ClassCastException e) {
System.err.println("轉(zhuǎn)換 XML 數(shù)據(jù)時發(fā)生錯誤: " + 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) {
// 假設(shè)有一個對象 person,你需要將其轉(zhuǎn)換為 XML
Person person = new Person("John", 30);
String filePath = "D:/Desktop/person.xml";
// 調(diào)用靜態(tài)方法將對象轉(zhuǎn)換為 XML 并寫入文件
XmlUtils.objectToXml(person, filePath);
// 從 XML 文件中讀取并轉(zhuǎn)換為對象
Person readPerson = XmlUtils.xmlToObject(filePath, Person.class);
System.out.println(readPerson);
}
}
輸出結(jié)果:
XML 內(nèi)容已成功寫入到文件:D:\Desktop\person.xml
Person(name=John, age=30)
D:/Desktop/person.xml文件內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<Person>
<name>John</name>
<age>30</age>
</Person>
總結(jié)
JavaBean 轉(zhuǎn) XML:使用 XStream 的 toXML 方法將 Java 對象轉(zhuǎn)換為 XML 字符串。
XML 轉(zhuǎn) JavaBean:使用 XStream 的 fromXML 方法將 XML 字符串轉(zhuǎn)換為 Java 對象。
自定義標(biāo)簽名稱:可以使用注解或配置方法來自定義 XML 標(biāo)簽名稱。
以上就是淺析如何使用xstream實(shí)現(xiàn)javaBean與xml互轉(zhuǎn)的詳細(xì)內(nèi)容,更多關(guān)于javaBean與xml互轉(zhuǎn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
常用json與javabean互轉(zhuǎn)的方法實(shí)現(xiàn)
這篇文章主要介紹了常用json與javabean互轉(zhuǎn)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
java 使用memcached以及spring 配置memcached完整實(shí)例代碼
本篇文章主要介紹了java 使用memcached以及spring 配置memcached完整實(shí)例代碼,具有一定的參考價值,有興趣的可以了解一下2017-07-07
Java將Object轉(zhuǎn)換為數(shù)組的代碼
這篇文章主要介紹了Java將Object轉(zhuǎn)換為數(shù)組的情況,今天在使用一個別人寫的工具類,這個工具類,主要是判空操作,包括集合、數(shù)組、Map等對象是否為空的操作,需要的朋友可以參考下2022-09-09
深入理解Java運(yùn)行時數(shù)據(jù)區(qū)_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java運(yùn)行時數(shù)據(jù)區(qū)的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-06-06
java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌
這篇文章主要為大家詳細(xì)介紹了java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
SpringBoot項(xiàng)目打包運(yùn)行jar包的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項(xiàng)目打包運(yùn)行jar包的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

