Android studio 下的 XML pull解析

         Android原生系统的XML解析就是用的pull解析。由此我们可以得出两个信号:

         1、pull解析肯定有独特的优势,能从dom、sax解析中脱颖而出。

   2、我们在使用pull解析时不需要导入额外的第三方jar包,直接使用

   本例中用到的权限有:sd卡文件读写权限

文件目录如下图:

Android studio 下的 XML pull解析_第1张图片

图:xml pull解析文件目录

     在Android Studio下,将需要解析的文件放入assets目录,新建asset目录的方法:右键src后,如下图操作:

 Android studio 下的 XML pull解析_第2张图片

图:新建assets目录

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

            1、Person.xml 文件

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

            2XmlParser.java文件

public class XmlParser {
    /**
     * 用pull解析器解析xml文件,存入List 集合中
     *
     * @param in 读取的Person.xml文件对应的输入流
     * @return 将读取到的List集合返回
     * @throws Exception
     */
    public static List xmlParser(InputStream in) throws Exception {
        List 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();
                    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 集合放入XML文件中
     * @param persons  要写入XML的List集合
     * @param os   写入到哪里
     * @throws Exception
     */
    public static void createXML(List 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();
    }
}

            3、XmlParserTest .java文件

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 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集合到XML文件中是否正确
     */
    public void test2(){
        List persons = new ArrayList();
        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();
        }
    }
}

           List内容写到XML文件,我是将XML文件存入了本地SD中,原因:

     1assets目录下,不可写;

                        2、真机未root,无法访问data/data目录;

     3、模拟器需要下载,太麻烦了,而且电脑本身有些慢。

 

    直接下载demo

你可能感兴趣的:(android学习)