Android XML數據的三種解析方式(Pull解析)

Pull 解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如: 開始元素和結束元素事件,使用 parser.next() 可以進入下一個元素並觸發相應事件。跟 SAX 不同的 是, Pull 解析器產生的事件是一個數字,而非方法,

首先先在Assets目錄下創建file.xml 加入如下的內容

<?xml version="1.0"?>
<records>
    <employee>
        <name>張飛</name>
        <surname>張</surname>
        <salary>50000</salary>
    </employee>

    <employee>
        <name>孫權 </name>
        <surname>孫</surname>
        <salary>60000</salary>
    </employee>

    <employee>
        <name>魯智深</name>
        <surname>魯</surname>
        <salary>70000</salary>
    </employee>

</records>

編寫activity代碼

package com.example.abc.xmlpaserdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class PullActivity extends AppCompatActivity {
private static  final String TAG =PullActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sax);
        try {
            InputStream is = getAssets().open("file.xml");
            List<Employee> employees = pull2xml(is);
            for(Employee employee:employees){
                Log.i(TAG, "onCreate: " +employee.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
    }

    private List<Employee> pull2xml(InputStream is) throws XmlPullParserException, IOException {
        List<Employee> list = null;
        Employee employee = null;
        XmlPullParser parser = Xml.newPullParser();
        ///初始化xmlPull解析器
        parser.setInput(is, "utf-8");
        //讀取文件的類型
        int type = parser.getEventType();
        //無限判斷文件類型進行讀取
        while (type != XmlPullParser.END_DOCUMENT) {
            switch (type) {
                //開始標籤
                case XmlPullParser.START_TAG:
                    if ("records".equals(parser.getName())) {
                        list = new ArrayList<>();
                    } else if ("employee".equals(parser.getName())) {
                        employee = new Employee();
                    } else if ("name".equals(parser.getName())) {
                        //獲取name值
                        String name = parser.nextText();
                        employee.setName(name);
                    } else if ("surname".equals(parser.getName())) {
                        //獲取nickName值
                        String surname = parser.nextText();
                        employee.setSurName(surname);
                    } else if ("salary".equals(parser.getName())) {
                        //獲取nickName值
                        String salary = parser.nextText();
                        employee.setSalary(Integer.parseInt(salary));
                    }
                    break;

                //結束標籤
                case XmlPullParser.END_TAG:
                    if ("employee".equals(parser.getName())) {
                        list.add(employee);
                    }
                    break;
            }
            //繼續往下讀取標籤類型
            type = parser.next();
        }
        return list;
    }

}

 

效果圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章