Android studio 下的 XML pull解析

         Android原生系統的XML解析就是用的pull解析。由此我們可以得出兩個信號:

         1、pull解析肯定有獨特的優勢,能從dom、sax解析中脫穎而出。

   2、我們在使用pull解析時不需要導入額外的第三方jar包,直接使用

   本例中用到的權限有:sd卡文件讀寫權限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

文件目錄如下圖:


圖:xml pull解析文件目錄

     在Android Studio下,將需要解析的文件放入assets目錄,新建asset目錄的方法:右鍵src後,如下圖操作:

 

圖:新建assets目錄

    以下是xml pull解析的核心文件。

            1、Person.xml 文件

<span style="font-size:12px;">public class Person {
    private int id;
    private String name;
    private int age;

    public Person(){

    }

    public Person(int id, String name, int age){
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

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

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

    public void setName(String name) {
        this.name = name;
    }
}</span>

            2XmlParser.java文件

<span style="font-size:12px;">public class XmlParser {
    /**
     * 用pull解析器解析xml文件,存入List<Person> 集合中
     *
     * @param in 讀取的Person.xml文件對應的輸入流
     * @return 將讀取到的List<Person>集合返回
     * @throws Exception
     */
    public static List<Person> xmlParser(InputStream in) throws Exception {
        List<Person> persons = null;
        Person person = null;
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(in, "utf-8");

        int event = parser.getEventType();
        while (XmlPullParser.END_DOCUMENT != event) {
            switch (event) {
                case XmlPullParser.START_DOCUMENT:
                    persons = new ArrayList<Person>();
                    break;
                case XmlPullParser.START_TAG:
                    if ("person".equals(parser.getName())) {
                        person = new Person();
                        int id = new Integer(parser.getAttributeValue(0));
                        person.setId(id);
                    }
                    if ("name".equals(parser.getName())) {
                        String name = parser.nextText();
                        if (null != name) {
                            person.setName(name);
                        }
                    }
                    if ("age".equals(parser.getName())) {
                        String text = parser.nextText();
                        if (null != text) {
                            int age = new Integer(text);
                            person.setAge(age);
                        }
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if ("person".equals(parser.getName()) && (null != persons && null != person)) {
                        persons.add(person);
                        person = null;
                    }
                    break;
            }

            event = parser.next();
        }
        return persons;
    }

    /**
     * 用 XmlSerializer 將List<Person> 集合放入XML文件中
     * @param persons  要寫入XML的List<Person>集合
     * @param os   寫入到哪裏
     * @throws Exception
     */
    public static void createXML(List<Person> persons, OutputStream os) throws Exception {
        XmlSerializer serializer = Xml.newSerializer();
        serializer.setOutput(os, "utf-8");
        serializer.startDocument("utf-8", true);
        serializer.startTag(null, "persons");
        for(Person person : persons) {
            serializer.startTag(null, "person");

            serializer.attribute(null, "id", person.getId() + "");

            serializer.startTag(null, "name");
            serializer.text(person.getName());
            serializer.endTag(null, "name");

            serializer.startTag(null, "age");
            serializer.text(person.getAge()+"");
            serializer.endTag(null, "age");

            serializer.endTag(null, "person");
        }
        serializer.endTag(null, "persons");
        serializer.endDocument();
        os.flush();
        os.close();
    }
}</span>

            3、XmlParserTest .java文件

<span style="font-size:12px;">public class XmlParserTest extends AndroidTestCase {
    private static final String TAG = "XmlParserTest";

    /**
     * 測試解析XML是否正確
     */
    public void test() {
        AssetManager manager = this.getContext().getAssets();
        try {
            InputStream in = manager.open("Person.xml");
            List<Person> persons = XmlParser.xmlParser(in);
            for(Person person:persons){
                Log.i(TAG, "id:"+person.getId()+
                        ";name:"+person.getName()+
                        ";age:"+person.getAge());
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 測試寫入List<Person>集合到XML文件中是否正確
     */
    public void test2(){
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person(1,"麗麗", 18));
        persons.add(new Person(2, "花花", 20));
        File f = CheckFileUtil.checkFile(Constants.FILE_PATH, "createXml.xml");
        try {
            FileOutputStream fos = new FileOutputStream(f);
            XmlParser.createXML(persons, fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}</span>

           List<person>內容寫到XML文件,我是將XML文件存入了本地SD中,原因:

     1assets目錄下,不可寫;

                        2、真機未root,無法訪問data/data目錄;

     3、模擬器需要下載,太麻煩了,而且電腦本身有些慢。

 

    直接下載demo

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