Android Xml Pull解析

1. 代碼示例

數據放入Student類,這裏是測試代碼,放在了內部類裏面

@main/assets/layout.xml

<?xml version="1.0" encoding="utf-8"?>
<students>
    <student>
        <name>zhang san</name>
        <sex>boy</sex>
        <age>18</age>
        <love>music world</love>
    </student>
    <student>
        <name>zhang 1</name>
        <sex>girl</sex>
        <age>20</age>
        <love>vidio world</love>
    </student>

    <sex>girl5</sex>
    <age>205</age>
    <love>vidio5 world</love>
</students>

@XmlParser.java

package com.tsp.util;

import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import android.util.Xml;
//android/libcore/xml/src/main/java/org/xmlpull/v1/XmlPullParser.java android自帶的類
import org.xmlpull.v1.XmlPullParser;

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

public class XmlParser {

    private static final String TAG = XmlParser.class.getSimpleName();


    public void testAssetParserXml(Context context) {
        AssetManager asset = context.getAssets();
        try{
            InputStream inputStream=asset.open("layout.xml");
            List<Student> list = getStudents(inputStream);
            for (Student stu : list){
                Log.d(TAG, "xml list: " + stu.toString());
            }
        }catch (Throwable e){
            e.printStackTrace();
        }
    }


    public List<Student> getStudents(InputStream inputStream)throws Throwable{
        List<Student> studentList = null;
        Student mStudent = null;

        //創建XmlPullParser
        XmlPullParser parser= Xml.newPullParser();
        //解析文件輸入流
        parser.setInput(inputStream,"UTF-8");
        //得到當前的解析對象
        int eventType=parser.getEventType();
        //當解析工作還沒完成時,調用next()方法得到下一個解析事件
        while (eventType != XmlPullParser.END_DOCUMENT){
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    //解析開始的時候初始化list
                    studentList = new ArrayList<>();
                    break;
                case XmlPullParser.START_TAG:
                    //獲得解析器當前指向的元素的名字
                    //當指向元素的名字和id,name,sex這些屬性重合時可以返回他們的值
                    String XPPname = parser.getName();
                    Log.d(TAG, "name---: " + XPPname );
                    if ("student".equals(XPPname)){
                        //通過解析器獲取id的元素值,並設置一個新的Student對象的id
                        mStudent = new Student();
                    }
                    if (mStudent!=null)
                    {
                        if("name".equals(XPPname))
                        {
                            //得到當前指向元素的值並賦值給name
                            mStudent.setName(parser.nextText());
                        }
                        if("age".equals(XPPname))
                        {
                            //得到當前指向元素的值並賦值給age
                            mStudent.setAge(parser.nextText());
                        }
                        if("sex".equals(XPPname))
                        {
                            //得到當前指向元素的值並賦值給sex
                            mStudent.setSex(parser.nextText());
                        }
                        if("love".equals(XPPname))
                        {
                            //得到當前指向元素的值並賦值給sex
                            mStudent.setLove(parser.nextText());
                        }
                    }
                    break;
                //出發結束元素事件
                case XmlPullParser.END_TAG:
                    if("student".equals(parser.getName()))
                    {
                        studentList.add(mStudent);
                        mStudent = null;
                    }
                    break;
                default:
                    break;
            }
            eventType = parser.next();
        }
        return studentList;
    }


    private class Student {
        private String name;
        private String sex;
        private String age;
        private String love;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public String getLove() {
            return love;
        }

        public void setLove(String love) {
            this.love = love;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    ", age='" + age + '\'' +
                    ", love='" + love + '\'' +
                    '}';
        }
    }

}

@MainActivity.java

XmlParser parser = new XmlParser();
parser.testAssetParserXml(this);

2.結果log

結果看上一個一個解析的,解析完一個,進入下一個循環

11-29 07:26:24.233  4003  4003 D XmlParser: name---: students
11-29 07:26:24.234  4003  4003 D XmlParser: name---: student
11-29 07:26:24.234  4003  4003 D XmlParser: name---: name
11-29 07:26:24.234  4003  4003 D XmlParser: name---: sex
11-29 07:26:24.234  4003  4003 D XmlParser: name---: age
11-29 07:26:24.234  4003  4003 D XmlParser: name---: love
11-29 07:26:24.234  4003  4003 D XmlParser: name---: student
11-29 07:26:24.234  4003  4003 D XmlParser: name---: name
11-29 07:26:24.234  4003  4003 D XmlParser: name---: sex
11-29 07:26:24.234  4003  4003 D XmlParser: name---: age
11-29 07:26:24.235  4003  4003 D XmlParser: name---: love
11-29 07:26:24.235  4003  4003 D XmlParser: name---: sex
11-29 07:26:24.235  4003  4003 D XmlParser: name---: age
11-29 07:26:24.235  4003  4003 D XmlParser: name---: love
11-29 07:26:24.235  4003  4003 D XmlParser: xml list: Student{name='zhang san', sex='boy', age='18', love='music world'}
11-29 07:26:24.235  4003  4003 D XmlParser: xml list: Student{name='zhang 1', sex='girl', age='20', love='vidio world'}

3. 擴展

3.1 修改添加xml

xml添加運動項目

<?xml version="1.0" encoding="utf-8"?>
<students>
    <student>
        <name>zhang san</name>
        <sex>boy</sex>
        <age>18</age>
        <love>music world</love>

        <sports>
            <sportlist>ball</sportlist>
            <sportlist>swimming</sportlist>
            <sportlist>song</sportlist>
        </sports>

    </student>
    <student>
        <name>zhang 1</name>
        <sex>girl</sex>
        <age>20</age>
        <love>vidio world</love>
        <sports>
            <sportlist>11</sportlist>
            <sportlist>22</sportlist>
            <sportlist>33</sportlist>
        </sports>
    </student>

    <sex>girl5</sex>
    <age>205</age>
    <love>vidio5 world</love>
</students>

Student類添加變量


private List<String> sportlist;

public List<String> getSportlist() {
    return sportlist;
}

public void setSportlist(List<String> sportlist) {
    this.sportlist = sportlist;
}

getStudents()增加如下代碼

List<String> sports = null;

if("sports".equals(XPPname)) {
    sports = new ArrayList<>();
}
if(sports != null) {
    if("sportlist".equals(XPPname)) {
        sports.add(parser.nextText());
        mStudent.setSportlist(sports);
    }

}

3.2 結果

最後結果得到了sportlist

11-29 07:43:03.837  4207  4207 D XmlParser: name---: students
11-29 07:43:03.837  4207  4207 D XmlParser: name---: student
11-29 07:43:03.837  4207  4207 D XmlParser: name---: name
11-29 07:43:03.838  4207  4207 D XmlParser: name---: sex
11-29 07:43:03.838  4207  4207 D XmlParser: name---: age
11-29 07:43:03.838  4207  4207 D XmlParser: name---: love
11-29 07:43:03.838  4207  4207 D XmlParser: name---: sports
11-29 07:43:03.838  4207  4207 D XmlParser: name---: sportlist
11-29 07:43:03.838  4207  4207 D XmlParser: name---: sportlist
11-29 07:43:03.838  4207  4207 D XmlParser: name---: student
11-29 07:43:03.838  4207  4207 D XmlParser: name---: name
11-29 07:43:03.838  4207  4207 D XmlParser: name---: sex
11-29 07:43:03.838  4207  4207 D XmlParser: name---: age
11-29 07:43:03.839  4207  4207 D XmlParser: name---: love
11-29 07:43:03.839  4207  4207 D XmlParser: name---: sports
11-29 07:43:03.839  4207  4207 D XmlParser: name---: sportlist
11-29 07:43:03.839  4207  4207 D XmlParser: name---: sportlist
11-29 07:43:03.839  4207  4207 D XmlParser: name---: sex
11-29 07:43:03.839  4207  4207 D XmlParser: name---: age
11-29 07:43:03.839  4207  4207 D XmlParser: name---: love
11-29 07:43:03.839  4207  4207 D XmlParser: xml list: Student{name='zhang san', sex='boy', age='18', love='music world', sportlist=[ball, swimming, song]}
11-29 07:43:03.840  4207  4207 D XmlParser: xml list: Student{name='zhang 1', sex='girl', age='20', love='vidio world', sportlist=[11, 22, 33]}

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