Android 用 XStream 將複雜xml解析為javabean
Android開發中,我們解析伺服器給我們的資料一般就是JSON和XML 兩種格式的內容。
JSON的解析我們可選的比較多 如Gson fastJson 等。我們之前說了 用GsonFormat來解析JSON並且自動生成相應的javabean, 一般來說,解析XML最快的方式,就是和伺服器商量把資料傳輸方式換位JSON。。。但是有時候我們不可不免的遇到XML需要解析。如果少量的話,那麼我們直接用JDK提供的pull方式去解析就可以了。
但是如果比較多,也比較複雜。那麼我們還是選擇第三方庫來完成比較好。
XStream的jar包的下載。
下載完成之後裡面包含了 xstream.jar 和 xapp3.jar。
Xstream序列化XML時可以允許使用者使用不同的XML解析器,使用者可以使用一個標準的JAXP DOM解析器或自Java6整合StAX解析器。這樣使用者就不需要依賴xpp3.jar。
//XStream xstream = new XStream();//需要XPP3庫
//XStream xstream = new XStream(new DomDriver());//不需要XPP3庫
//XStream xstream = new XStream(new StaxDriver());//不需要XPP3庫開始使用Java6
由於也有許多版本了,而我開始下載的是1.4.8版本的。匯入之後總是報錯。後來看網上說是1.4.8要java8支援,沒考證,不過的確換成1.4.7就可以了,而且看版本使用統計 1.4.7也的確是使用人數最多的。
使用
我們拿到那個內容的xml字串之後。可以同過下面幾句程式碼將內容轉為javaBean
XStream stream = new XStream();
stream.processAnnotations(TestBean.class);//這裡需要註解是你自己根據xml寫的bean類(下面附程式碼解釋xml)
TestBean result = (TestBean) stream.fromXML(xmlStr);
例項1
xml內容為:
<china dn="day">
<city prov= "西安">
<name >陝西</name>
<age>18</age>
<year>2016</year>
</city>
<city prov= "鄭州">
<name>河南</name>
<age>20</age>
<year>2016</year>
</city>
<city prov= "石家莊">
<name>河北</name>
<age>22</age>
<year>2016</year>
</city>
<city prov= "三亞">
<name>海南</name>
<age>88</age>
<year>2016</year>
</city>
</china>
首先這個xml串,是有一個List 集合,然後因為有dn=“day”的屬性,相當於和List同級有一個 欄位
然後每一個city 裡面 有 prov 、name、age、year 等欄位引數。
我們編寫一個javabean :
@XStreamAlias("china")//類註解(必須寫)
public class ChinaBean {
@XStreamAsAttribute() @XStreamAlias("dn") //屬性註解
private String dn;
@XStreamImplicit(itemFieldName = "city")//節點註解(必須寫)
private List<CityBean> city;
//省略dn 和 city 的 getter 和 setter 方法
public static class CityBean {
//值不用註解
private int year;
private String name;
private int age;
@XStreamAsAttribute() @XStreamAlias("prov")//屬性是必須用註解宣告的
private String prov;
//省略getter 和setter 方法
}
}
如果xml的資料再複雜點
其實也沒複雜多少,和上面的差不多,只不過多了好幾個屬性。
那麼我們對照著寫出這個天氣預報的bean
@XStreamAlias("china")//這裡用到註解(必須寫)
public class TestBean {
@XStreamAsAttribute() @XStreamAlias("dn")
private String dn;
/**
* tem2 : -20
* tem1 : -8
* quName : 黑龍江
* cityname : 哈爾濱
* pyName : heilongjiang
* stateDetailed : 多雲
* state2 : 1
* state1 : 1
* windState : 西北風3-4級轉小於3級
*/
@XStreamImplicit(itemFieldName = "city")//節點註解(必須寫)
private List<CityBean> city;
//省略getter setter方法
public static class CityBean {
@XStreamAsAttribute() @XStreamAlias("tem2")
private int tem2;
@XStreamAsAttribute() @XStreamAlias("tem1")
private int tem1;
@XStreamAsAttribute() @XStreamAlias("quName")
private String quName;
@XStreamAsAttribute() @XStreamAlias("cityname")
private String cityname;
@XStreamAsAttribute() @XStreamAlias("pyName")
private String pyName;
@XStreamAsAttribute() @XStreamAlias("stateDetailed")
private String stateDetailed;
@XStreamAsAttribute() @XStreamAlias("state2")
private int state2;
@XStreamAsAttribute() @XStreamAlias("state1")
private int state1;
@XStreamAsAttribute() @XStreamAlias("windState")
private String windState;
//省略getter setter方法
}
}
我們看看丁香園論壇的rss資料
上個數據截圖:
我們分析一下這個資料:
- 最外層是 rss 裡面有 好幾個屬性(需要註解),還有一個 channel的內容。
- channel裡面 有好幾個內容,並且有一個image的類和 一個數據的List(需要註解)
- image類裡面有三個內容,
- List中的每條Itembean 中 有幾個內容,並且有一條內容還有屬性(註解)
- 由於有的標籤是dc:date 這種格式。但是我們的變數不能這樣命名,所以這種需要註解來增加別名。
我們一層一層去解析:
@XStreamAlias("rss") //別名註解
public class DxyBean {
@XStreamAsAttribute() @XStreamAlias("xmlns:dc")
private String dc;
@XStreamAsAttribute() @XStreamAlias("xmlns:rdf")
private String rdf;
@XStreamAsAttribute() @XStreamAlias("xmlns:taxo")
private String taxo;
@XStreamAsAttribute() @XStreamAlias("version")
private String version;
private ChannelBean channel;
//省略getter setter方法
public static class ChannelBean {
private String title;
private String link;
private String description;
private String language;
private String pubDate;
@XStreamAlias("dc:date")
private String dcdate;
@XStreamAlias("dc:language")
private String dclanguage;
private ImageBean image;
@XStreamImplicit(itemFieldName = "item")//節點註解(必須寫)
private List<ItemBean> item;
//省略getter setter方法
public static class ImageBean {
private String title;
private String url;
private String link;
//省略getter setter方法
}
public static class ItemBean {
private String title;
private String link;
private String description;
private String category;
private String pubDate;
private String guid;
@XStreamAlias("dc:creator")
private String dccreator;
@XStreamAlias("dc:date")
private String dcdate;
@XStreamAsAttribute()
private String domain;
//省略getter setter方法
}
}
}
我們可以看到,對於屬性的註解 1是必須寫的,而如果我們的變數名 和標籤裡面的標籤名相同,則相對於上圖來說2那個註解是可以省略的。
我們從上面幾個栗子看到,有屬性和有值的xml的解析方式,那麼其他的型別應該也都是大同小異了。
XStream的幾種註解
Xstream註解常用知識:
@XStreamAlias("message") 別名註解 作用目標: 類,欄位
@XStreamImplicit 隱式集合
@XStreamImplicit(itemFieldName="part") 作用目標: 集合欄位
@XStreamConverter(SingleValueCalendarConverter.class) 注入轉換器 作用目標: 物件
@XStreamAsAttribute 轉換成屬性 作用目標: 欄位
@XStreamOmitField 忽略欄位 作用目標: 欄位
Auto-detect Annotations 自動偵查註解
xstream.autodetectAnnotations(true);
自動偵查註解與XStream.processAnnotations(Class[] cls)的區別在於效能.自動偵查註解將快取所有類的型別.
相關推薦
Android 用 XStream 將複雜xml解析為javabean
Android開發中,我們解析伺服器給我們的資料一般就是JSON和XML 兩種格式的內容。 JSON的解析我們可選的比較多 如Gson fastJson 等。我們之前說了 用GsonFormat來解析JSON並且自動生成相應的javabean, 一般來說,解析
Xstream將XML轉換為javabean的問題
AS http javabean bean 如果 bubuko 出現 對象 .com 1.問題:Xstream is not security 解決方法:加上 2.問題:如果沒有第二行代碼,會出現xstream forbiddenclassexception 解決方法:加
python 將元組解析為多個引數
#create a tuple tuplex = 4, 8, 3 print(tuplex) n1, n2, n3 = tuplex #unpack a tuple in variables print(n1 + n2 + n3) #the number of variables mus
將log4j.xml修改為log4j2.xml
最近由於工作原因需要將log4j 1.2版本升級為2.0以上,就需要將log4j配置檔案修改成2.0版本 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configurati
C++11新特性(66)- 用static_cast將左值轉換為右值
溫故而知新 本文涉及兩個概念,static_cast和右值引用,在閱讀本文之前,最好先閱讀下面的文章。 使用std::move 考察下面兩個函式: 除了引數型別一個是左值引用,一個是右值引用以外都一樣。結合前面的文章可以得出下面的結論:左值引用表明這個
將JDBC ResultSet解析為JSON格式
JSON (JavaScript Object Notation) is a lightweight data-interchange format. JSON建構於兩種結構: “名稱/值”對的集合(A collection of name/val
Excel用程式碼將工作表儲存為工作簿
今天,做會計的朋友問我一個問題,怎麼講Excel的工作表拆分成單獨的檔案,並給我發了一個連結。 https://jingyan.baidu.com/article/75ab0bcb0ecc67d6874db27e.html 說這個在他那執行不了,他還以為是offic
dicom之將dcm檔案解析為jpg後等比例壓縮
前段時間用dcm4chee對dcm檔案進行了轉換,轉換格式為bmp和jpg,但是轉化完後發現6M的dcm原始檔變成了一個13M的bmp,手機端顯示會很吃力,於是決定做個壓縮處理,提供兩種壓縮方式,第一種方式的壓縮時間會比較長,第二種就比較好:code1:package co
android 用程式碼完全實現xml佈局的控制
有的時候我們必須用程式碼來控制佈局,最常見的就是長和寬,其實用程式碼控制可以做到xml程式碼控制不了的目的。看如下程式碼。 View view=((Activity)context).getLayoutInflater().inflate(R.layout.vehicle
如何將自定義的沒有結束標籤的xml轉換為javabean物件
資料格式如下: <tellerLvl0>0</><brc>3004</><fPIflag>0</><termIP>6.1.14.11</><channelId>12&
java將xml解析,然後將其轉換為json格式(①)
java將xml裡面的內容解析的方法在我前面的文章:java解析xml檔案獲取xml裡面的資訊 有什麼問題可以給我留言!!! 下面就是如何將model轉換為json格式的內容: public class Student { private String
Java用OpenOffice將word轉換為PDF
sts pre 成功 accep 存在 china ati url 基礎 本文在原文的基礎上有所修改,原文請參考: http://titanseason.iteye.com/blog/1471606 由於此blog不支持附件附件請到此處下載 http://my.oschin
設置用戶密碼時,將全角轉換為半角
英文字母 har 分享 elf bsp log 密碼 解決 mage 情景: 註冊管理員賬號,用戶輸入的是全角密碼,登錄時輸入半角密碼,顯示密碼錯誤 解決方案: 將全角密碼改成半角密碼 var password = self.loginForm.password /
在Ubuntu14.04下安裝 ffmpeg-2.4.13(處理視頻用,將視頻保存為圖片序列)
ibm blog 提取 ext aac sta video images bmp 首先在 http://www.ffmpeg.org/olddownload.html 下載 ffmpeg-2.4.13.tar.bz2 ; 然後安裝 yasm 和 libx264: apt
AndroidManifest.xml裏加入不同package的component (Activity、Service裏android:name裏指定的值一般為句號加類名),可以通過指定完全類名(包名+類名)來解決
代碼 gui 目的 tools 註冊 不同 res 收藏 small 我們都知道對於多個Activity如果在同一個包中,在Mainfest中可以這樣註冊 Xml代碼 <span style="font-size: small;"><?xml
將xml處理為json對象數組
lac XML match return function str == new for function xmlStr2js(xmlStr) { var tagNames = xmlStr.match(/<\w+>/g) tagNames = deWeigh
用shell實現將動態ip修改為靜態ip,靜態ip修改為其它靜態ip
linux 用shell修改ip (1) 將動態ip修改為靜態ip的思路 ① 修改ip之前,先備份ifcfg-eth0文件 ② 進入網卡配置目錄 /etc/sysconfig/network-scripts/ifcfg-eth0 ③ 修改BOOTPROTO=static ④ 修
用Python將多個excel表格合並為一個表格
test form log num nump 數據 哪裏 workbook 一份 生活中經常會碰到多個excel表格匯總成一個表格的情況,比如你發放了一份表格讓班級所有同學填寫,而你負責將大家的結果合並成一個。諸如此類的問題有很多。除了人工將所有表格的內容一個一個復制到匯總
UWP DEP0700: 應用程序註冊失敗。[0x80073CF9] 另一個用戶已安裝此應用的未打包版本。當前用戶無法將該版本替換為打包版本。
.cn 打包 ive 另一個 pan package 用戶 AC size 原文:UWP DEP0700: 應用程序註冊失敗。[0x80073CF9] 另一個用戶已安裝此應用的未打包版本。當前用戶無法將該版本替換為打包版本。最近電腦抽風,我在【應用程序和功能】中重置了以下我
利用反射將xml轉換為List<Object>
反射 uppercase 效率 code varchar2 對象 測試的 trac getname 在將xml轉為實體類的時候,一直對於類型為Integer, date等的很難處理, 無法轉換, 但是後來我發現通過反射可以解決這一問題, 下面和大家分享一下 首先: 給