XStream是一个Java对象和XML相互转换的工具,很好很强大。提供了所有的基础类型、数组、集合等类型直接转换的支持。
XStream中的核心类就是XStream类,一般来说,熟悉这个类基本就够用了。
由于XStream.jar依赖于xmlpull.jar 所以,需将这两个jar一同导入。
下载地址 : https://pan.baidu.com/s/1eSpZs3o#path=%252F%25E5%25B7%25A5%25E5%2585%25B7jar
XStream对象相当Java对象和XML之间的转换器,转换过程是双向的。创建XSteam对象的方式很简单,只需要new XStream()即可。
Java到xml,用toXML()方法。
Xml到Java,用fromXML()方法。
别名配置包含三种情况:
1、类别名,用alias(String name, Class type)。
2、类成员别名,用aliasField(String alias, Class definedIn, String fieldName)
3、类成员作为属性别名,用 aliasAttribute(Class definedIn, String attributeName, String alias),单独命名没有意义,还要通过useAttributeFor(Class definedIn, String fieldName) 应用到某个类上。
别名的配置是非常重要的,但是其中有些细节问题很重要。简单举例如下 :
普通java对象 :
package com.test; public class Freind { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Freind [name=" + name + ", age=" + age + "]"; } }
package com.test; import java.util.List; public class Person { private int id; private String name; private List<Freind> fav; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Freind> getFav() { return fav; } public void setFav(List<Freind> fav) { this.fav = fav; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", fav=" + fav + "]"; } }
测试类 :
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import com.test.Freind; import com.test.Person; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class XstreamTest { public static void main(String[] args) throws IOException { XStream stream = new XStream(new DomDriver()); Person pr = new Person(); pr.setId(1); pr.setName("张三"); List<Freind> favs = new ArrayList<Freind>(); for(int i = 18; i < 20; i++) { Freind fd = new Freind(); fd.setAge(i); fd.setName("混混" + i); favs.add(fd); } pr.setFav(favs); System.out.println("-------------起别名前-----------------"); System.out.println(stream.toXML(pr)); System.out.println("-------------起别名后-----------------"); //类起别名 stream.alias("person", pr.getClass()); stream.alias("freind", Freind.class); System.out.println(stream.toXML(pr)); System.out.println("--------friend字段当属性处理---------"); //字段“name”当属性处理 stream.useAttributeFor(Freind.class, "name"); System.out.println(stream.toXML(pr)); System.out.println("-------------xml转java对象-----------------"); Person result = (Person) stream.fromXML(stream.toXML(pr)); System.out.println(result.toString()); } }
输出结果 :
-------------起别名前----------------- <com.test.Person> <id>1</id> <name>张三</name> <fav> <com.test.Freind> <name>混混18</name> <age>18</age> </com.test.Freind> <com.test.Freind> <name>混混19</name> <age>19</age> </com.test.Freind> </fav> </com.test.Person> -------------起别名后----------------- <person> <id>1</id> <name>张三</name> <fav> <freind> <name>混混18</name> <age>18</age> </freind> <freind> <name>混混19</name> <age>19</age> </freind> </fav> </person> --------friend字段当属性处理--------- <person> <id>1</id> <name>张三</name> <fav> <freind name="混混18"> <age>18</age> </freind> <freind name="混混19"> <age>19</age> </freind> </fav> </person> -------------xml转java对象----------------- Person [id=1, name=张三, fav=[Freind [name=混混18, age=18], Freind [name=混混19, age=19]]]