• Android笔记(四十六) Android中的数据存储——XML(二)PULL解析


    PULL 的工作原理: 

             XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser.nextText()从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument事件。 

    类和接口  功能
    XmlPullParser 该解析器是一个在org.xmlpull.v1中定义的解析功能的接口。
    XmlSerializer 它是一个接口,定义了XML信息集的序列。
    XmlPullParserFactory 这个类用于在XMPULL V1 API中创建XML Pull解析器。
    XmlPullParserException 抛出单一的XML pull解析器相关的错误。

             它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

             读取到xml的声明返回 START_DOCUMENT

             结束返回 END_DOCUMENT  

             开始标签返回 START_TAG 

             结束标签返回 END_TAG 

             示例:

    MainActivity.java

    package cn.lixyz.xmltest.activity;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import cn.lixyz.xmltest.R;
    import cn.lixyz.xmltest.model.Student;
    import cn.lixyz.xmltest.parser.DOMForXML;
    import cn.lixyz.xmltest.parser.PULLForXML;
    import cn.lixyz.xmltest.parser.SAXForXML;
    
    public class MainActivity extends Activity {
    
        private Button bt_readxml_dom, bt_writexml_dom, bt_writexml_sax, bt_readxml_sax, bt_readxml_pull, bt_writexml_pull;
    
        private List<Student> list;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            findView();
        }
    
        private void findView() {
            bt_readxml_dom = (Button) findViewById(R.id.bt_readxml_dom);
            bt_writexml_dom = (Button) findViewById(R.id.bt_writexml_dom);
            bt_writexml_sax = (Button) findViewById(R.id.bt_writexml_sax);
            bt_readxml_sax = (Button) findViewById(R.id.bt_readxml_sax);
            bt_readxml_pull = (Button) findViewById(R.id.bt_readxml_pull);
            bt_writexml_pull = (Button) findViewById(R.id.bt_writexml_pull);
        }
    
        public void clickButton(View view) {
            DOMForXML domForXML;
            SAXForXML saxForXML;
            PULLForXML pullForXML;
            switch (view.getId()) {
            case R.id.bt_readxml_dom:
                domForXML = new DOMForXML();
                domForXML.domReadXML();
                break;
    
            case R.id.bt_writexml_dom:
                domForXML = new DOMForXML();
                domForXML.domWriterXML();
                break;
            case R.id.bt_readxml_sax:
                saxForXML = new SAXForXML();
                saxForXML.saxReaderXML();
                break;
            case R.id.bt_writexml_sax:
                saxForXML = new SAXForXML();
                saxForXML.saxWriterXML();
                break;
            case R.id.bt_writexml_pull:
                pullForXML = new PULLForXML();
                pullForXML.pullWriterXML();
                break;
            case R.id.bt_readxml_pull:
                pullForXML = new PULLForXML();
                pullForXML.pullReaderXML();
                break;
            }
        }
    
    }

    activity_main.xml

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            tools:context="cn.lixyz.xmltest.activity.MainActivity" >
    
            <Button
                android:id="@+id/bt_writexml_dom"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="clickButton"
                android:text="DOM方式生成XML" />
    
            <Button
                android:id="@+id/bt_readxml_dom"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="clickButton"
                android:text="DOM方式读取XML" />
    
            <Button
                android:id="@+id/bt_writexml_sax"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="clickButton"
                android:text="SAX方式生成XML" />
    
            <Button
                android:id="@+id/bt_readxml_sax"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="clickButton"
                android:text="SAX方式读取XML" />
    
            <Button
                android:id="@+id/bt_writexml_pull"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="clickButton"
                android:text="PULL生成XML" />
    
            <Button
                android:id="@+id/bt_readxml_pull"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="clickButton"
                android:text="PULL解析XML" />
        </LinearLayout>
    
    </ScrollView>

    PULLForXML.java

    package cn.lixyz.xmltest.parser;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import org.xmlpull.v1.XmlSerializer;
    
    import android.util.Log;
    import android.util.Xml;
    import cn.lixyz.xmltest.model.Student;
    
    public class PULLForXML {
    
        // pull生成xml文件
        public void pullWriterXML() {
            
            //创建数据源
            List<Student> listData = createStudents();
            File fileFolder = new File("data/data/cn.lixyz.xmltest/files");
            if (!fileFolder.exists()) {
                fileFolder.mkdir();
                Log.d("TTTT", "文件夹不存在,已经创建");
            }
    
            FileOutputStream fileOutputStream;
            try {
                fileOutputStream = new FileOutputStream("data/data/cn.lixyz.xmltest/files/studentForPull.xml");
                
                XmlSerializer xmlSerializer = Xml.newSerializer();
                xmlSerializer.setOutput(fileOutputStream, "UTF-8");
    
                xmlSerializer.startTag(null, "students");
                
                for (Student student : listData) {
                    xmlSerializer.startTag(null, "student");
                    xmlSerializer.attribute("", "id", student.getId() + "");
    
                    xmlSerializer.startTag(null, "name");
                    xmlSerializer.text(student.getName());
                    xmlSerializer.endTag(null, "name");
    
                    xmlSerializer.startTag(null, "age");
                    xmlSerializer.text(student.getAge() + "");
                    xmlSerializer.endTag(null, "age");
                    xmlSerializer.endTag(null, "student");
                }
                xmlSerializer.endTag(null, "students");
                xmlSerializer.endDocument();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        // pull读取xml文件
        public void pullReaderXML() {
            List<Student> listData = null;
            Student student = null;
    
            try {
                FileInputStream fileInputStream = new FileInputStream(
                        new File("data/data/cn.lixyz.xmltest/files/studentForPull.xml"));
                XmlPullParser xmlPullParser = Xml.newPullParser();
                xmlPullParser.setInput(fileInputStream, "UTF-8");
    
                int event = xmlPullParser.getEventType();
    
                while (event != xmlPullParser.END_DOCUMENT) {
                    switch (event) {
                    case XmlPullParser.START_DOCUMENT:
                        listData = new ArrayList<Student>();
                        break;
    
                    case XmlPullParser.START_TAG:
                        if ("student".equals(xmlPullParser.getName())) {
                            student = new Student();
                            int id = Integer.parseInt(xmlPullParser.getAttributeValue(0));
                            student.setId(id);
                        } else if ("name".equals(xmlPullParser.getName())) {
                            String name = xmlPullParser.nextText();
                            student.setName(name);
                        } else if ("age".equals(xmlPullParser.getName())) {
                            int age = Integer.parseInt(xmlPullParser.nextText());
                            student.setAge(age);
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("student".equals(xmlPullParser.getName())) {
                            listData.add(student);
                        }
                    }
                    event = xmlPullParser.next();
                }
                for (Student s : listData) {
                    Log.d("TTTT", s.getId() + "->" + s.getName() + "->" + s.getAge());
                }
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        // 模拟生成xml的数据
        private List<Student> createStudents() {
            List<Student> listData = new ArrayList<Student>();
            listData = new ArrayList<Student>();
            Student s1 = new Student();
            s1.setId(11);
            s1.setName("张三");
            s1.setAge(10);
            listData.add(s1);
            Student s2 = new Student();
            s2.setId(22);
            s2.setName("李四");
            s2.setAge(11);
            listData.add(s2);
            Student s3 = new Student();
            s3.setId(33);
            s3.setName("王五");
            s3.setAge(12);
            listData.add(s3);
            Student s4 = new Student();
            s4.setId(44);
            s4.setName("赵六");
            s4.setAge(13);
            listData.add(s4);
            Student s5 = new Student();
            s5.setId(55);
            s5.setName("刘七");
            s5.setAge(14);
            listData.add(s5);
            return listData;
        }
    }

    Student.java

    package cn.lixyz.xmltest.model;
    
    public class Student {
    
        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;
        }
    
    }

      

  • 相关阅读:
    Python学习第61天(html之form标签)
    Python学习第60天(html之body标签)
    Python学习第59天(web前端html /1))
    Python学习第58天(selector版本的ftp习题实现)
    Python学习第57天(异步IO)
    Python学习第56天(configpraser模块复习)
    Python学习第55天(IO多路复用)
    Python学习第54天(阻塞(blocking) IO和非阻塞(non-blocking)IO)
    如何通过Git Bash的命令行将电脑本地项目上传到自己的GitHub上
    第10周周博客
  • 原文地址:https://www.cnblogs.com/xs104/p/4924674.html
Copyright © 2020-2023  润新知