Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發筆記之PULL解析xml文件

android開發筆記之PULL解析xml文件

編輯:關於Android編程

在android開發中,經常用到去解析xml文件。我們今天來學習一下XML文件的解析,在java中我們應該知道兩種解析方式:DOM和SAX解析方式,我這裡就不講解DOM和SAX的解析方式了,有興趣的同學可以向我要示例或者自己上網查查,這裡重點講解一下Android中常用並且官方推薦的方式:

PULL解析方式

PULL解析方式采用事件驅動進行解析的,當pull解析器,開始解析之後,我們可以調用它的next()方法,來獲取下一個解析事件(就是開始文檔,結束文檔,開始標簽,結束標簽),當處於某個元素時可以調用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調用它的nextText()獲取本節點的值。

這裡寫圖片描述

步驟:

①拿到加載資源文件XML的解析器

②通過解析器獲得事件類型

③根據事件類型判斷並獲取相應的值

那來做下吧,

准備了一個簡單的xml文件:

movie.xml



    
        憤怒的小鳥
        animation
        English
    
    
        葉問
        action
        chinese
    

在res/目錄下新建一個文件夾xml,將此xml文件放進去。

這裡寫圖片描述

可以看到最外層的節點 Movies 中包含兩個 Movie ,而每個 Movie 中又包含三個屬性:name 、type 、language

所以我們可以新建一個Movie 類來保存解析出來的每個 Movie , Movie中應該有四個屬性 id 、name 、type 、language

Movie.java

public class Movie {

    private String id;      //id
    private String name;    //電影名
    private String type;    //電影類型
    private String language;//語言
    public Movie() {
        super();
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getLanguage() {
        return language;
    }
    public void setLanguage(String language) {
        this.language = language;
    }
    @Override
    public String toString() {
        return "Movie [id=" + id + ", name=" + name + ", type=" + type
                + ", language=" + language + "]";
    }

}

布局文件:

activity_main.xml



    

MainActivity.java

public class MainActivity extends Activity {

    private TextView show;
    private Movie movie;
    private List movieList; //存放電影的集合
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (TextView) findViewById(R.id.show);
    }
    /*
     * 這是一個按鈕的點擊事件
     * 
     * 在這裡用pull方式來解析xml文件
     */
    public void pull(View view) {
        //從xml資源文件夾加載movie.xml文件
        XmlResourceParser XmlParser = getResources().getXml(R.xml.movie);
        // 拿到第一個事件類型,事件類型為END_DOCUMENT,START_DOCUMENT,START_TAG,END_TAG等
        try {
            int type = XmlParser.getEventType();
            while (type != XmlResourceParser.END_DOCUMENT) {    //結束節點(即),只要不是結束節點就遍歷
                switch (type) {
                case XmlResourceParser.START_DOCUMENT:      //開始節點(即  )
                    System.out.println("開始解析");
                    movieList = new ArrayList();
                    break;
                case XmlResourceParser.START_TAG:       
                    if ("Movie".equals(XmlParser.getName())) {  //開始元素()
                        //getAttributeValue獲得Movie節點的屬性
                        movie = new Movie();
                        movie.setId(XmlParser.getAttributeValue(null, "id"));
                    }
                    if ("name".equals(XmlParser.getName())) {   //開始子元素()
                        /// 通過nextText()就可以獲得子節點的文本的值
                        movie.setName(XmlParser.nextText());
                    }
                    if ("type".equals(XmlParser.getName())) {   //開始子元素()
                        /// 通過nextText()就可以獲得子節點的文本的值
                        movie.setType(XmlParser.nextText());
                    }
                    if ("language".equals(XmlParser.getName())) {   //開始子元素()
                        /// 通過nextText()就可以獲得子節點的文本的值
                        movie.setLanguage(XmlParser.nextText());
                    }
                    break;
                case XmlResourceParser.END_TAG:
                    if ("Movie".equals(XmlParser.getName())) {  //結束元素()
                        movieList.add(movie);
                        movie = null;
                    }
                    break;
                default:
                    break;
                }
                //獲取下一個解析事件((即開始文檔,結束文檔,開始標簽,結束標簽))
                type = XmlParser.next();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        //解析結束,將結果顯示在TextView上
        show.setText(movieList.toString());
    }
}

大家看看注釋,應該很清楚。當然,除以上三種外還有很多解析xml的方法,比如DOM4JJDOM等等。但其基本的解析方式包含兩種,一種是事件驅動的(代表SAX),另一種方式是基於文檔結構(代表DOM)。其他的只不過語法不一樣而已。

結果:

這裡寫圖片描述

   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved