阳光博文 你的空间 知识的容器

XML解析之-XStream解析

本例使用XStream生成一个xml文件,再发序列化xml文件内容。

XStream是一个简单的类库,可以序列化对象到xml,还可以将xml还原为对象。 
XStream官网:http://xstream.codehaus.org/ 
附件提供XStream和xpp3相关的jar下载: 
xstream-1.2.2.jar 
xpp3-1.1.3.3_min.jar 
为了使用XStream,需要对其初始化,初始化方法有两种: 

  • XStream xstream = new XStream();   这种方式的初始化需要xpp3-[version].jar的支持。xpp是一个快速解析XML文件的解析器。
  • XStream xstream = new XStream(new DomDriver()); XStream xStream = new XStream(new DomDriver("utf-8"))      这种方式不需要依赖XPP3.jar的支持,它是使用标准的JAXP DOM来解析它。

同时这里对mode参数做个简单的说明: 
在XStream序列化或反序列化对象时,它会创建两个类MarshallingContext和UnmarshallingContext,由它们来处理数据,以及委派合适的转换器。XStream提供了三对上下文的缺省实现,它们之间有着细微的差别。缺省值可以通过方法XStream.setMode()来改变,需要传递下面参数中的一个: 

  • XStream.XPATH_RELATIVE_REFERENCES:(缺省)通过XPath引用来标识重复的引用,使用相对路径表示。
  • XStream.XPATH_ABSOLUTE_REFERENCES:通过XPath引用来标识重复的引用,使用绝对路径表示。
  • XStream.ID_REFERENCES:使用ID引用来标识重复的引用。在一些场合(手写XML时),将会更易于操作
  • XStream.NO_REFERENCES:这种情况将失去对图形对象的支持,仅把对象看作为树型结构。重复的引用被视作两个不同的对象,循环引用会导致异常产生。相对于上面两种模式,这种模式速度会更快,占用内存会更
这个例子包含有3个简单的java类,其中两个是javabean,另外一个是逻辑处理类。
两个javabean类如下:
Person.java
Java代码  收藏代码
  1. public class Person {  
  2.     private int id;  
  3.     private String name;  
  4.     private int age;  
  5.     private PhoneNumber phone;  
  6.     public int getId() {  
  7.         return id;  
  8.     }  
  9.     public void setId(int id) {  
  10.         this.id = id;  
  11.     }  
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.     public PhoneNumber getPhone() {  
  25.         return phone;  
  26.     }  
  27.     public void setPhone(PhoneNumber phone) {  
  28.         this.phone = phone;  
  29.     }  
  30.     @Override  
  31.     public String toString() {  
  32.         return "Person [id=" + id + ", name=" + name + ", age=" + age  
  33.                 + ", phone=" + phone + "]";  
  34.     }  
  35. }  
 PhoneNumber.java
Java代码  收藏代码
  1. public class PhoneNumber {    
  2.     private int code;    
  3.     private String number;  
  4.     public int getCode() {  
  5.         return code;  
  6.     }  
  7.     public void setCode(int code) {  
  8.         this.code = code;  
  9.     }  
  10.     public String getNumber() {  
  11.         return number;  
  12.     }  
  13.     public void setNumber(String number) {  
  14.         this.number = number;  
  15.     }  
  16.     @Override  
  17.     public String toString() {  
  18.         return "PhoneNumber [code=" + code + ", number=" + number + "]";  
  19.     }    
  20. }    
 
实现功能最主要是下面这个类了:
XStreamTest.java
Java代码  收藏代码
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4.   
  5. import com.thoughtworks.xstream.XStream;  
  6.   
  7. public class XStreamTest {  
  8.     public static void main(String[] args) throws Exception {  
  9.         Person person = initPerson();  
  10.         XStream xStream = new XStream();  
  11.         xStream.alias("person", Person.class);  
  12.         FileOutputStream fileOutputStream=new FileOutputStream(new File("test.xml"));    
  13.         xStream.toXML(person,fileOutputStream);    
  14.           
  15.         //反序列化  
  16.         FileInputStream fileInputStream=new FileInputStream(new File("test.xml"));    
  17.         Person person1=(Person)xStream.fromXML(fileInputStream);    
  18.         System.out.println(person1.toString());    
  19.     }  
  20.       
  21.     public static Person initPerson(){  
  22.         Person person = new Person();  
  23.         person.setId(20);  
  24.         person.setName("huangwei");  
  25.         person.setAge(24);  
  26.           
  27.         PhoneNumber phoneNumber = new PhoneNumber();  
  28.         phoneNumber.setCode(222);  
  29.         phoneNumber.setNumber("15200000000");  
  30.         person.setPhone(phoneNumber);  
  31.           
  32.         return person;  
  33.     }  
  34. }  
 
打印生成的xml文件内容如下:
Xml代码  收藏代码
  1. <person>  
  2.   <id>20</id>  
  3.   <name>huangwei</name>  
  4.   <age>24</age>  
  5.   <phone>  
  6.     <code>222</code>  
  7.     <number>15200000000</number>  
  8.   </phone>  
  9. </person>  
 
反序列化解过如下:
Java代码  收藏代码
Person [id=20, name=huangwei, age=24, phone=PhoneNumber [code=222, number=15200000000]]

在线咨询