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

}

效果图:

原创文章 29 获赞 1 访问量 9258

猜你喜欢

转载自blog.csdn.net/qinxuexiang_blog/article/details/104855070