Android XML文件解析之pull解析器

在Android中XML解析是一種很重要的儲存文本信息的的方式

XML解析有三中方式:

  1. SAX 解析器
  2. DOM 解析器
  3. pull 解析器

在這裏我主要寫的是PULL解析器解析XML,在Android中集成了pull解析器,所以從側面凸顯比較推薦使用pull解析器。

我將解析文件存放於assets目錄下
解析XML內容:

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id= "23">
        <name>liming</name>
        <age>30</age>
    </person>
    <person id= "20">
        <name>zahngxiaoxiao</name>
        <age>25</age>
    </person>
</persons>

解析類PersonService類代碼:

package com.example.administrator.foundationdemo.xmlparsepull.service;

import android.util.Xml;

import com.example.administrator.foundationdemo.xmlparsepull.domain.Person;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

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

/**
 * Created by Administrator on 2016/12/2.
 */
public class PersonService {

    public static List<Person> getPersonXML (InputStream xml) throws Exception{
        List<Person> persons = null;
        Person person = null;
        //可通過pull解析器工場得到實例方法==》 XmlPullParserFactory.newInstance().newPullParser();
        XmlPullParser pullParser = Xml.newPullParser();//通Xml過幫助類獲得pull解析器實例
        pullParser.setInput(xml,"UTF-8");//爲pull解析器設置要解析的XML數據
        /**分析:
         * pull解析器會將數據讀到一個 char[] = {-<..XML..>-}中
         * pull解析器會自動讀取開始段(及第一段“<?xml version="1.0" encoding="utf-8"?>”)類容,
         * 從而判斷是否符合XML開始類容的某一個語法,並觸發對應語法所對應的事件
         */
        int exent = pullParser.getEventType();//第一個事件及開始的事件
        while (exent != XmlPullParser.END_DOCUMENT){
            switch (exent){
                case XmlPullParser.START_DOCUMENT://DOCUMENT(開始事件)
                    persons = new ArrayList<Person>();
                    break;
                case XmlPullParser.START_TAG: //節點開始的TAG
                    if ("person".equals(pullParser.getName())){
                        int id = Integer.parseInt(pullParser.getAttributeValue(0));
                        person = new Person();
                        person.setId(id);
                    }
                    if ("name".equals(pullParser.getName())){
                       String name = pullParser.nextText();
                        person.setName(name);
                    }
                    if ("age".equals(pullParser.getName())){
                        int age = Integer.parseInt(pullParser.nextText());
                        person.setAge(age);
                    }
                    break;
                case XmlPullParser.END_TAG: //節點結束的TAG
                    if ("person".equals(pullParser.getName())){
                        persons.add(person);
                        person = null;
                    }
                    break;

            }
            //當解析完開始事件之後,PLL解析器不會主動向下解析,
            // 需要調用如下(.next())API,調用一次向下解析一步
            exent = pullParser.next();
        }


        return persons;
    }
}

解析類容生成子類的person類代碼:

package com.example.administrator.foundationdemo.xmlparsepull.domain;

/**
 * Created by Administrator on 2016/12/2.
 */
public class Person {

    private int id;
    private String name ;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }
}

Activity代碼:

package com.example.administrator.foundationdemo.xmlparsepull;

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

import com.example.administrator.foundationdemo.R;
import com.example.administrator.foundationdemo.xmlparsepull.domain.Person;
import com.example.administrator.foundationdemo.xmlparsepull.service.PersonService;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

public class XMLParsePullActivity extends AppCompatActivity {

    TextView xml_parse_text ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
        xmlParse();
    }

    private void init(){
        setContentView(R.layout.activity_xmlparse_pall);
        xml_parse_text = (TextView) findViewById(R.id.xml_parse_text);
    }

    private void xmlParse(){

        try {
            InputStream xml = this.getResources().getAssets().open("person.xml");// 獲取assets下XM文件輸出流
           List<Person> persons = PersonService.getPersonXML(xml);
            for (Person person : persons ){
                String text = xml_parse_text.getText()+" \n id:"+person.getId()+"\n name:"+person.getName()+"\nage:"+person.getAge();
                Log.d("FLY",text);
                xml_parse_text.setText(text);
            }
        } catch (Exception e) {
            Log.d("FLY","出錯了"+e);
            e.printStackTrace();
        }
    }
}

希望對你們有幫助,謝謝!!!

發佈了41 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章