1. 程式人生 > >Android 用 XStream 將複雜xml解析為javabean

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資料

上個數據截圖:

這裡寫圖片描述

我們分析一下這個資料:

  1. 最外層是 rss 裡面有 好幾個屬性(需要註解),還有一個 channel的內容。
  2. channel裡面 有好幾個內容,並且有一個image的類和 一個數據的List(需要註解)
  3. image類裡面有三個內容,
  4. List中的每條Itembean 中 有幾個內容,並且有一條內容還有屬性(註解)
  5. 由於有的標籤是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, 一般來說,解析

XstreamXML轉換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&

javaxml解析,然後其轉換json格式(①)

java將xml裡面的內容解析的方法在我前面的文章:java解析xml檔案獲取xml裡面的資訊 有什麼問題可以給我留言!!! 下面就是如何將model轉換為json格式的內容: public class Student { private String

JavaOpenOfficeword轉換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等的很難處理, 無法轉換, 但是後來我發現通過反射可以解決這一問題, 下面和大家分享一下 首先: 給