XStream 簡介
XStream是一款能夠非常簡單實現(xiàn) XML與 實體類 之間轉(zhuǎn)換的類庫若厚,下文就簡單地記錄下其主要使用方法痴昧。
直接上代碼
一 實體轉(zhuǎn)XML
1.1 簡單使用
public class Student {
public Student(String name,int age){
this.name=name;
this.age=age;
}
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;
}
Student student=new Student("matt",18);
XStream xStream=new XStream();
String xmlStudent = xStream.toXML(student);
以下為輸入結果:
<com.laxton.rms.upload.bean.Student>
<age>18</age>
<name>matt</name>
</com.laxton.rms.upload.bean.Student>
1.2 alias
有沒有覺得com.laxton.rms.upload.bean.Student很礙眼煎楣,我們可以通過關鍵字alias更改給它換一個別名。
Student student=new Student("matt",18);
XStream xStream=new XStream();
xStream.alias("Student",Student.class);//為類名節(jié)點重命名
String xmlStudent = xStream.toXML(student);
以下為輸入結果:
<Student>
<age>18</age>
<name>matt</name>
</Student>
這樣就舒服多了署恍。
1.3 useAttributeFor
<Student atrr="Attribute">
<age>18</age>
<name>matt</name>
</Student>
這個XML的格式跟上一個是有區(qū)別的隔显,在Student這個節(jié)點里多了一個atrr="Attribute"却妨,那么我們要怎么添加這樣的格式呢?
首先括眠,在Student實體類里添加一個字段:atrr
public class Student {
public Student(String name,int age){
this.name=name;
this.age=age;
}
public Student(String name,int age,String atrr){
this.name=name;
this.age=age;
this.atrr=atrr;
}
private String name;
private int age;
private String atrr;
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;
}
public String getAtrr() {
return atrr;
}
public void setAtrr(String atrr) {
this.atrr = atrr;
}
然后彪标,使用useAttributeFor關鍵字
Student student=new Student("matt",18,"Attribute");
XStream xStream=new XStream();
xStream.alias("Student",Student.class);//為類名節(jié)點重命名
xStream.useAttributeFor(Student.class,"atrr");
String xmlStudent = xStream.toXML(student);
輸出結果如下:
<Student atrr="Attribute">
<age>18</age>
<name>matt</name>
</Student>
1.4 問題:當實體類的某個值為null時,轉(zhuǎn)換的xml會收起這個節(jié)點不顯示
Student student=new Student(null,18);
XStream xStream=new XStream();
xStream.alias("Student",Student.class);//為類名節(jié)點重命名
String xmlStudent = xStream.toXML(student);
結果輸出:
<Student>
<age>18</age>
</Student>
在這個例子中掷豺,當我們給name賦予null值時捞烟,輸出的xml文本沒有 <name> 這個節(jié)點。網(wǎng)絡上有相關文章描述了如何通過Converter將賦為null值的字段依然顯示節(jié)點当船。
但本人覺得完全沒有必要這么做题画。因為當你將沒有 <name>節(jié)點的xml文本轉(zhuǎn)換為實體時,name字段會被賦予null值德频,這種相互之間的轉(zhuǎn)換是完全匹配的苍息。如果你將<name>節(jié)點強制顯示出來,當它轉(zhuǎn)換成實體類時壹置,name字段會被賦予空值竞思,反而與實際情況不符。
二 XML轉(zhuǎn)實體類
2.1 簡單使用
當我企圖用以下的xml文本轉(zhuǎn)換成實體類Student時報錯钞护。
<Student>
<age>18</age>
<name>matt</name>
</Student>
String xmlStr = "<Student>\n" +
" <age>18</age>\n" +
" <name>matt</name>\n" +
"</Student>";
XStream xStream=new XStream();
Student student = (Student)xStream.fromXML(xmlStr);
Log.i("vlog","name:"+student.getName());
Log.i("vlog","age:"+student.getAge());
恍然大悟后改成:
String xmlStr = "<com.laxton.rms.upload.beanStudent>\n" +
" <age>18</age>\n" +
" <name>matt</name>\n" +
"</com.laxton.rms.upload.beanStudent>";
....
就能成功地轉(zhuǎn)換盖喷,可現(xiàn)實中的xml文件是不會帶類名的。
2.2 alias
所以跟實體類轉(zhuǎn)XML一個道理 患亿,我們需要用到alias關鍵字传蹈。
String xmlStr = "<Student>\n" +
" <age>18</age>\n" +
" <name>matt</name>\n" +
"</Student>";
XStream xStream=new XStream();
xStream.alias("Student",Student.class);
Student student = (Student)xStream.fromXML(xmlStr);
Log.i("vlog","name:"+student.getName());
Log.i("vlog","age:"+student.getAge());
完美解決問題。
2.3 useAttributeFor
如果遇到如下xml文本步藕,應當怎樣將它轉(zhuǎn)換為實體類呢惦界?
String xmlStr = "<Student atrr=\"Attribute\">\n" +
" <age>18</age>\n" +
" <name>matt</name>\n" +
"</Student>";
跟上面的xml文本相比,這一個多了一個Student節(jié)點下的屬性:<Student atrr="Attribute">咙冗。
使用useAttributeFor關鍵字沾歪,完美解決問題,直接上代碼 :
String xmlStr = "<Student atrr=\"Attribute\">\n" +
" <age>18</age>\n" +
" <name>matt</name>\n" +
"</Student>";
XStream xStream=new XStream();
xStream.alias("Student",Student.class);
xStream.useAttributeFor(Student.class,"atrr");
Student student = (Student)xStream.fromXML(xmlStr);
Log.i("vlog","name:"+student.getName());
Log.i("vlog","age:"+student.getAge());
Log.i("vlog","atrr:"+student.getAtrr());
2.4 問題:xStream.fromXML(File)與xStream.fromXML(String)
問題描述:由.net服務器端生成的一份xml文件雾消,我將它拷貝放到安卓設備的SD卡灾搏,再將它的xml文本讀出來。嘗試用xStream.fromXML(String)的方法將其轉(zhuǎn)成對象立润,但報錯了狂窑,具體錯誤如下:
Caused by: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT @1:2 in java.io.StringReader@888018)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:432)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
找不著具體原因,也找不到解決辦法桑腮。
突然看到還有xStream.fromXML(File)這個接口泉哈,于是直接用xml文件的存放路徑new一個File再調(diào)用該接口,能夠順利轉(zhuǎn)換不會報錯破讨。
問題得以解決但并不清楚其它內(nèi)在原因丛晦。
嘗試過手動將這個文件的文本拷貝出來,新建另一個文件提陶,將文本粘貼進去烫沙。然后使用xStream.fromXML(String)進行轉(zhuǎn)換,也能順利轉(zhuǎn)換隙笆。