Pull解析Xml文件

来源:互联网 发布:网络蜘蛛磁力链 编辑:程序博客网 时间:2024/06/03 23:47

好久没有解析xml文件了,居然都快忘了,这两天后台居然返回的xml格式的数据,尼玛,好吧,随意在整理整理

一、什么是xml

eXtensiable Markup Language 可扩展标记语言

标记语言:由标签(标记)构成的语言。标记语言不是编程语言

 可扩展:所有的标签都是自定义的。没有预定义的

二、xml的作用

做数据存储
作为配置文件
作为数据载体,在网络中传输

解析思想:
 DOM:文档对象模型。一次性将xml文档全部加载进内存,在内存中形成一颗dom树型结构。操作dom树形结构,对文档进行增删改查的操作。
优点:可以对文档进行增删改查的所有操作
缺点:耗内存,速度慢。
 SAX:基于事件驱动,逐行读取
 监听机制:
事件:一件事件
事件源:事件发生的组件
监听器:一个对象,事件发生后会执行该对象的方法
注册监听:给事件源上绑定一个监听器,监听某一个事件的发生。
 优点:不占内存,速度快
 缺点:只能查询,不能增删改

大概回顾一下直接上代码,毕竟pull解析还是比较简单的

工程目录:


Student类

public class Student {    private String id;    private String name;    private String age;    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 getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "id='" + id + '\'' +                ", name='" + name + '\'' +                ", age='" + age + '\'' +                '}';    }}


public class MainActivity extends AppCompatActivity {    private InputStream is;    private TextView    tvContent;    List<Student> list    = null;    Student       student = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tvContent = (TextView) findViewById(R.id.tv_content);        try {            //获取资产目录下的xml文件            is = this.getAssets().open("students.xml");        } catch (IOException e) {            e.printStackTrace();        }    }    public void parse(View view) {        //解析xml        parseXml();        //将集合展示在TextView上        tvContent.setText(list.toString());    }    private void parseXml() {        //1.创建解析器工厂        XmlPullParserFactory factory = null;        try {            factory = XmlPullParserFactory.newInstance();            //2.获取解析器            XmlPullParser parser = factory.newPullParser();            //3.设置输入流            parser.setInput(new InputStreamReader(is));            //4.获取事件类型            int type = parser.getEventType();            //5.循环判断是否是文档的结束            while (type != XmlPullParser.END_DOCUMENT) {                /**                 * 需求:将xml文档中存储的数据封装为Student对象。将对象添加到集合中                 *                 * 分析:                 *        开始标签:                 *           * students:创建集合                 *           * student:创建Student对象,并且获取属性值,给对象的id属性赋值                 *           * name:获取其下一个文本,给对象的name属性赋值                 *           * age:获取其下一个文本,给对象的age属性赋值                 *                 *        结束标签:                 *           * student:将对象添加到集合中                 *                 */                //判断事件类型,做出不同的操作                //获取标签名称                String tagName = parser.getName();                switch (type) {                    case XmlPullParser.START_TAG:                        //判断标签名称是什么?做出不同的操作                        if ("students".equals(tagName)) {                            //创建集合                            list = new ArrayList<>();                        } else if ("student".equals(tagName)) {                            //创建对象,获取id属性值                            student = new Student();                            //获取属性值                            String id = parser.getAttributeValue(0);                            student.setId(id);                        } else if ("name".equals(tagName)) {                            //获取下一个文本,赋值                            String name = null;                            try {                                name = parser.nextText();                            } catch (IOException e) {                                e.printStackTrace();                            }                            student.setName(name);                        } else if ("age".equals(tagName)) {                            //获取下一个文本,赋值                            String age = null;                            try {                                age = parser.nextText();                            } catch (IOException e) {                                e.printStackTrace();                            }                            student.setAge(age);                        }                        break;                    case XmlPullParser.END_TAG:                        if ("student".equals(tagName)) {                            //装载集合                            list.add(student);                        }                        break;                    default:                        break;                }                //6.向下走一行,并且重新获取事件类型                try {                    type = parser.next();                } catch (IOException e) {                    e.printStackTrace();                }            }        } catch (XmlPullParserException e) {            e.printStackTrace();        }    }}

sdutents.xml 

<?xml version="1.0" encoding='utf-8'?><students>   <student id="s001">      <name>zz</name>      <age>23</age>         </student>      <student id="s002">      <name>ls</name>      <age>24</age>   </student>      <student id="s003">      <name>ww</name>      <age>25</age>   </student></students>
最终解析的数据:

 [Student{id='s001', name='zz', age='23'}, Student{id='s002', name='ls', age='24'}, Student{id='s003', name='ww', age='25'}]