淺析如何使用xstream實(shí)現(xiàn)javaBean與xml互轉(zhuǎn)
XStream 是一個(gè)用于將 Java 對(duì)象與 XML 之間進(jìn)行轉(zhuǎn)換的庫(kù)。它非常簡(jiǎn)單易用,適用于快速開發(fā)和原型設(shè)計(jì)。下面將詳細(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è)有一個(gè)簡(jiǎn)單的 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 對(duì)象轉(zhuǎn)換為 XML 字符串:
import com.thoughtworks.xstream.XStream; public class JavaBeanToXmlExample { public static void main(String[] args) { // 創(chuàng)建 Person 對(duì)象 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 對(duì)象:
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 會(huì)使用類名和字段名作為 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 對(duì)象 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); } }
知識(shí)延展
使用xstream實(shí)現(xiàn)對(duì)象與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 對(duì)象轉(zhuǎn)換為 XML,并寫入指定文件。 * * @param <T> 要轉(zhuǎn)換的 Java 對(duì)象類型 * @param object 要轉(zhuǎn)換的 Java 對(duì)象 * @param filePath 輸出的 XML 文件路徑 */ public static <T> void objectToXml(T object, String filePath) { // 為對(duì)象定義 XML 別名 xStream.alias(object.getClass().getSimpleName(), object.getClass()); StringWriter stringWriter = new StringWriter(); stringWriter.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); // 將對(duì)象轉(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 文件時(shí)發(fā)生錯(cuò)誤: " + e.getMessage()); e.printStackTrace(); } } /** * 從 XML 文件中讀取數(shù)據(jù)并轉(zhuǎn)換為 Java 對(duì)象。 * * @param filePath XML 文件路徑 * @param clazz 要轉(zhuǎn)換為的 Java 類 * @param <T> 轉(zhuǎn)換后的對(duì)象類型 * @return 轉(zhuǎn)換后的 Java 對(duì)象,如果讀取或轉(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 文件時(shí)發(fā)生錯(cuò)誤: " + e.getMessage()); e.printStackTrace(); } catch (ClassCastException e) { System.err.println("轉(zhuǎn)換 XML 數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤: " + e.getMessage()); e.printStackTrace(); } return null; } }
測(cè)試
package com.itheima.one; import com.itheima.one.XmlUtils; import com.itheima.util.Person; public class Main { public static void main(String[] args) { // 假設(shè)有一個(gè)對(duì)象 person,你需要將其轉(zhuǎn)換為 XML Person person = new Person("John", 30); String filePath = "D:/Desktop/person.xml"; // 調(diào)用靜態(tài)方法將對(duì)象轉(zhuǎn)換為 XML 并寫入文件 XmlUtils.objectToXml(person, filePath); // 從 XML 文件中讀取并轉(zhuǎn)換為對(duì)象 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 對(duì)象轉(zhuǎn)換為 XML 字符串。
XML 轉(zhuǎn) JavaBean:使用 XStream 的 fromXML 方法將 XML 字符串轉(zhuǎn)換為 Java 對(duì)象。
自定義標(biāo)簽名稱:可以使用注解或配置方法來(lái)自定義 XML 標(biāo)簽名稱。
以上就是淺析如何使用xstream實(shí)現(xiàn)javaBean與xml互轉(zhuǎn)的詳細(xì)內(nèi)容,更多關(guān)于javaBean與xml互轉(zhuǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
常用json與javabean互轉(zhuǎn)的方法實(shí)現(xiàn)
這篇文章主要介紹了常用json與javabean互轉(zhuǎn)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04java 使用memcached以及spring 配置memcached完整實(shí)例代碼
本篇文章主要介紹了java 使用memcached以及spring 配置memcached完整實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07Java將Object轉(zhuǎn)換為數(shù)組的代碼
這篇文章主要介紹了Java將Object轉(zhuǎn)換為數(shù)組的情況,今天在使用一個(gè)別人寫的工具類,這個(gè)工具類,主要是判空操作,包括集合、數(shù)組、Map等對(duì)象是否為空的操作,需要的朋友可以參考下2022-09-09java三個(gè)環(huán)境變量配置簡(jiǎn)單教程
這篇文章主要為大家詳細(xì)介紹了java三個(gè)環(huán)境變量配置簡(jiǎn)單教程,配置path變量、配置classpath變量、最后是配置JAVA_HOME變量,感興趣的小伙伴們可以參考一下2016-07-07深入理解Java運(yùn)行時(shí)數(shù)據(jù)區(qū)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java運(yùn)行時(shí)數(shù)據(jù)區(qū)的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-06-06java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌
這篇文章主要為大家詳細(xì)介紹了java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09SpringBoot項(xiàng)目打包運(yùn)行jar包的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項(xiàng)目打包運(yùn)行jar包的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02