«

Android下使用pull解析器生成XML文件、读取XML文件

时间:2024-3-2 18:58     作者:韩俊     分类: Android


Android下使用Pull解析器
    1,Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件。
    2,使用parser.next()可以进入下一个元素并触发相应事件。
    3,事件将作为一个int数值被发送,因此可以使用一个switch对相应的事件进行处理。
    4,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
    5,相关API:
        获得当前节点事件类型:parser.getEventType();
        获得下一节点事件类型:parser.next();
        获得标签属性值:      parser.getAttributeValue();
        获得标签后面文本内容:parser.nextText();

    例子:
        <?xml version="1.0" encoding="UTF-8"?>
        <persons>
            <person id=“18">
                <name>allen</name>
                <age>36</age>
            </person>
            <person id=“28">
                <name>james</name>
                <age>25</age>
            </person>
        </persons>

    // 使用Pull解析器生成XML文件,并写到本地
    private void writeXmlToLocal() {
        List<Person> personList = getPersonList();

        // 获得序列化对象
        XmlSerializer serializer = Xml.newSerializer();
//      XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();

        try {
            File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
            FileOutputStream fos = new FileOutputStream(path);

            // 指定序列化对象输出的位置和编码
            serializer.setOutput(fos, "utf-8");

                        // 写开始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
            serializer.startDocument("utf-8", true);      

            serializer.startTag(null, "persons");         // <persons>

            for (Person person : personList) {

                // 开始写person
                serializer.startTag(null, "person");      // <person>
                serializer.attribute(null, "id", String.valueOf(person.getId()));

                // 写person的name
                serializer.startTag(null, "name");            // <name>
                serializer.text(person.getName());
                serializer.endTag(null, "name");          // </name>

                // 写person的age
                serializer.startTag(null, "age");         // <age>
                serializer.text(String.valueOf(person.getAge()));
                serializer.endTag(null, "age");               // </age>

                serializer.endTag(null, "person");            // </person>
            }

            serializer.endTag(null, "persons");               // </persons>

            serializer.endDocument();                       // 结束
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 使用Pull解析器读取本地的XML文件
    private List<Person> parserXmlFromLocal() {
        try {
            File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
            FileInputStream fis = new FileInputStream(path);

            // 获得pull解析器对象
            XmlPullParser parser = Xml.newPullParser();
//          XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); 

            // 指定解析的文件和编码格式
            parser.setInput(fis, "utf-8");

            // 获得事件类型
            int eventType = parser.getEventType();

            List<Person> personList = null;
            Person person = null;
            String id;
            while(eventType != XmlPullParser.END_DOCUMENT) {

                // 获得当前节点的名称
                String tagName = parser.getName();

                switch (eventType) {
                case XmlPullParser.START_TAG:               // 当前等于开始节点  <person>
                    if("persons".equals(tagName)) {           // <persons>
                        personList = new ArrayList<Person>();
                    } else if("person".equals(tagName)) {     // <person id="1">
                        person = new Person();
                        id = parser.getAttributeValue(null, "id");
                        person.setId(Integer.valueOf(id));
                    } else if("name".equals(tagName)) {   // <name>
                        person.setName(parser.nextText());
                    } else if("age".equals(tagName)) {        // <age>
                        person.setAge(Integer.parseInt(parser.nextText()));
                    }
                    break;
                case XmlPullParser.END_TAG:     // </persons>
                    if("person".equals(tagName)) {
                        // 需要把上面设置好值的person对象添加到集合中
                        personList.add(person);
                    }
                    break;
                default:
                    break;
                }
                // 获得下一个事件类型
                eventType = parser.next();      
            }
            return personList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

    

标签: android

热门推荐