开发者社区> 文艺小青年> 正文

Android中XML解析-PULL解析

简介:
+关注继续查看

前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似,也是事件触发的。Pull解析方式让应用程序完全控制文档该怎么样被解析,比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理,只过PULL方式读xml回调方法返回的是数字。

Pull创建XML

创建XML先实例化一个序列化对象,之后的通过Tag进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public void createXML() {
        // 初始化一个序列化对象
        XmlSerializer serializer = Xml.newSerializer();
        File path = new File(getFilesDir(), "BookTest.xml");
        try {
            FileOutputStream foStream = new FileOutputStream(path);
            serializer.setOutput(foStream, "utf-8");
            //设置文档<?xml version='1.0' encoding='utf-8' standalone='yes'?>
            serializer.startDocument("utf-8"true);
            //设置根节点
            serializer.startTag(null"Books");
            for (int i = 1; i < 4; i++) {
                //设置子节点
                serializer.startTag(null"Book");
                serializer.attribute(null"name""书籍" + i);
                serializer.startTag(null"Title");
                serializer.text("内容" + i);
                serializer.endTag(null"Title");
                serializer.endTag(null"Book");
            }
            serializer.endTag(null"Books");
            serializer.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();
        }
    }

 生成的XML的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<Books>
 
    <Book name="书籍1" >
 
        <Title>
内容1
        </Title>
    </Book>
 
    <Book name="书籍2" >
        <Title>
内容2
        </Title>
    </Book>
 
    <Book name="书籍3" >
 
        <Title>
内容3
        </Title>
    </Book>
 
</Books>

Pull读取XML

首先看一张效果图:

展示内容调用getListBooksByPull方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public List<Book> getListBooksByPull() {
    list = new ArrayList<Book>();
    File path = new File(getFilesDir(), "BookTest.xml");
    try {
        FileInputStream inputStream = new FileInputStream(path);
        // 获得pull解析器对象
        XmlPullParser parser = Xml.newPullParser();
        // 指定解析的文件和编码格式
        parser.setInput(inputStream, "utf-8");
        int eventType = parser.getEventType(); // 获得事件类型
        Book book = null;
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagNameString = parser.getName();
            switch (eventType) {
            case XmlPullParser.START_TAG:
                if ("Book".equals(tagNameString)) {//Book标签
                    book = new Book();
                    book.setName(parser.getAttributeValue(null"name"));
                else if ("Title".equals(tagNameString)) {//Title标签
                    book.setTitle(parser.nextText());
                }
                break;
            case XmlPullParser.END_TAG:
                if ("Book".equals(tagNameString)) {
                    list.add(book);
                }
                break;
            default:
                break;
            }
            eventType = parser.next();//重新赋值,不然会死循环
        }
    catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return list;
}

 相对于Dom和SAX来说,Pull比较简单易读,不过简单的总结一下常用的几个方法:读取到xml的声明返回      START_DOCUMENT; 读取到xml的结束返回       END_DOCUMENT ; 读取到xml的开始标签返回 START_TAG ,读取到xml的结束标签返回 END_TAG 读取到xml的文本返回       TEXT .

Activity加载时候调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
ListView listView = (ListView) findViewById(R.id.list_pull);
    ArrayList<HashMap<String, String>> arrayList = new ArrayList<HashMap<String, String>>();
    list = getListBooksByPull();
    for (Book book : list) {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("itemTitle", book.getName());
        map.put("itemText", book.getTitle());
        arrayList.add(map);
    }
    SimpleAdapter simpleAdapter = new SimpleAdapter(this, arrayList,
            R.layout.book, new String[] { "itemTitle""itemText" },
            new int[] { R.id.itemTitle, R.id.itemText });
    listView.setAdapter(simpleAdapter);

  简单回顾一下三种解析方式,Dom解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机配置不行可能会死机。SAX解析是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。Pull解析器和SAX解析器很相似,但SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。Pull的写法确实很轻巧也很容易上手,个人比较喜欢Pull。

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4069483.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring 基于XML开发 bean 配置 连接池
Spring 基于XML开发 bean 配置 连接池
3 0
你知道学校里的MySQL与社会中的MySQL有啥区别吗?(详解四服务器性能剖析)
本文经验都是我看书学习的总结的一些经验,面试常问的知识点,所以请关注后再继续观看学习!下面已经给出了书的目录!今后将按目录的顺序继续更新学习心得!接上文继续分享
3 0
Spring之XML 配置AOP 事务管理
Spring之XML 配置AOP 事务管理
3 0
2020总结,迎战2021,大三专科转Java挑战阿里大厂面试
文章标题我有点夸大,但是我要声明:不管最后能不能去阿里,如果我们的个人技术能力能达到阿里的面试水准,我相信大多数公司都会给你发offer。所以阿里面试是我的一个目标与进步的动力。所以这也是我为什么从写一些项目坑转到写一些Java的类,包,库的一些底层实现原理以及面试的原因。
4 0
Vue项目Vite配置代理解决跨域问题
Vue项目Vite配置代理解决跨域问题
3 0
Vue3项目配置Mock模拟接口数据
Vue3项目配置Mock模拟接口数据
2 0
Vue 动态添加路由及生成菜单
Vue 动态添加路由及生成菜单
5 0
浅谈Vue2中provide和inject使用
浅谈Vue2中provide和inject使用
4 0
在Vue3中使用Provide / Inject
在Vue3中使用Provide / Inject
3 0
对比Vue2中Options API 和 Vue3中Composition API
对比Vue2中Options API 和 Vue3中Composition API
4 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载