Android xml解析

xml解析有三种方式

dom解析,sax解析,pull解析

1-dom

DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大

2-SAX

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;

3-pull

Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目,Android SDK中已经集成了Pull解析器,无需添加任何jar文件。Android系统中推荐使用Pull

SAX和PULL区别

SAX解析器
工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;
Pull解析器
工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。
pull是一个while循环,随时可以跳出,而sax不是,sax是只要解析了,就必须解析完成。

pull解析


public class XmlParserUtils {

    public static List parserXml(InputStream inputStream)
            throws Exception {

        // [0]创建集合 把书的信息封装到集合
        List lists = null;
        Book book = null;
        // [1]通过Xml工具类来获取xml解析器
        XmlPullParser parser = Xml.newPullParser();
        // [3]获取解析器后 告诉解析器具体要解析哪个xml文档
        parser.setInput(inputStream, "utf-8");
        // [4]通过解析器获取xml解析事件类型
        int eventType = parser.getEventType();
        // [5]使用循环 把我们关心的数据解析出来 这块逻辑最好不 要写1 因为阅读型不好
        while (eventType != XmlPullParser.END_DOCUMENT) {

            // [6]具体判断一下到底是开始标签 还是结束标签
            switch (eventType) {
                case XmlPullParser.START_TAG: // 代表解析到的是开始标签
                    // [6.1]具体判断一下到底解析的是哪个开始标签
                    if ("bookstore".equals(parser.getName())) {
                        // [6.2]创建集合对象用来存每本书的信息
                        lists = new ArrayList();
                    } else if ("book".equals(parser.getName())) {
                        // [6.3]当解析到book标签的时候创建book对象
                        book = new Book();
                    } else if ("name".equals(parser.getName())) {
                        // [6.4]获取书名 把书名存到book对象里
                        String name = parser.nextText();
                        book.setName(name);
                    } else if ("price".equals(parser.getName())) {
                        // [6.4]获取书名 把书名存到book对象里
                        String price = parser.nextText();
                        book.setPrice(price);
                    }
                    break;

                case XmlPullParser.END_TAG: // 代表解析的是结束标签
                    if ("book".equals(parser.getName())) {
                        // 把book对象(javabean) 加入到集合中
                        lists.add(book);

                    }
                    break;
            }

            // [7]不到文档结尾 就一直解析
            eventType = parser.next();
        }

        return lists;
    }

}

你可能感兴趣的:(Android xml解析)