XmlPullParser简单使用

Android  2024年10月19日 am8:26发布7天前更新 91es.com站长
4 0 0

前言

本文记录一下AndroidXmlPullParserxml的解析记录。记录于此,方便自己查阅。

正文

xml介绍

XML: Extentsible Markup Language(可扩展标记语言)的缩写,它的格式与HTML文件的格式类似,xml是使用自定义标记来定义对象和每个对象中的数据,xml文件可以被认为是基于文本的数据库。

一个XML文档由两部分构成:第一部分是文档声明,第二部分是文档元素(节点)。

文档声明通常位于XML文档的顶端,根元素之前出现,它是一个特定的包含XML 文档设定信息的部分

XML 文档由如下几个部分组成:

  1. XML 声明:用来设置XML文档解析时所需的基本参数。

  2. 处理指令:为某个特定类型的软件反馈一条特殊的指令。

  3. 文档类型定义:用来设置更多高级的信息,如实体、属性及有效性相关的信息。

  4. 注释:用于提醒XML文档作者或临时标注出文档中不完善的部分。

参考文1对这块介绍比较详细,可以去看看。

xml解析

xml解析有三种方式,SAXDOM和PULL解析,下面单独介绍一下。

SAX

SAX(Simple API for XML)使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。

缺点:不能倒退。

DOM

DOM(Document Object Model)是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。

缺点:加载大文档时效率低下。

Pull

Pull是Android官方解析布局文件所使用的方式。

Pull与SAX有点类似,都提供了类似的事件,如开始元素和结束元素。

不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而在SAX内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。

对比
  1. 内存占用:SAX、Pull比DOM要好;

  2. 编程方式:SAX采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类XML,就要编写一个新的适合该类XML的处理类。DOM是W3C的规范,Pull简洁。

  3. 访问与修改:SAX采用流式解析,DOM随机访问。

  4. 访问方式:SAX,Pull解析的方式是同步的,DOM逐字逐句。

使用Pull解析

这里使用Android推荐的解析方式,也就是Pull方法,涉及的主要类是XmlPullParser。

其他方法的使用推荐看参考文2

这里以上一篇《XmlSerializer简单使用》中例子2的为示例。

部分内容跟《XmlSerializer简单使用》重复,这里省略

student.xml中存储的数据,这里是JSON格式存储的自定义类List数据。

//xml路径
mXmlPath = getFilesDir().getPath() + "/student.xml";

内容

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<school>
<mList data='[&#10;  {&#10;    "age": 16,&#10;    "name": "张三",&#10;    "score": 500.0&#10;  },&#10;  {&#10;    "age": 17,&#10;    "name": "李四",&#10;    "score": 490.0&#10;  },&#10;  {&#10;    "age": 15,&#10;    "name": "王五",&#10;    "score": 580.0&#10;  }&#10;]' />
</school>
mGson = new GsonBuilder().setPrettyPrinting().create();

开始解析

FileInputStream fileInputStream = null;
try {
    fileInputStream = new FileInputStream(mXmlPath);
    XmlPullParser xmlPullParser = Xml.newPullParser();
    xmlPullParser.setInput(fileInputStream, "utf-8");
    int eventType = xmlPullParser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
            case XmlPullParser.START_DOCUMENT:
                break;
            case XmlPullParser.START_TAG:
                String name = xmlPullParser.getName();
                //节点下属性个数
                int count = xmlPullParser.getAttributeCount();
                for (int i = 0; i < count; i++) {
                    //获取属性name和value
                    //xmlPullParser.getAttributeName(i)
                    //xmlPullParser.getAttributeValue(i)
                    if (xmlPullParser.getAttributeName(i).equals("data")) {
                        String data = xmlPullParser.getAttributeValue(i);
                        ArrayList<Student> list = mGson.fromJson(data, new TypeToken<ArrayList<Student>>()}.getType());
                    }
                }
                break;
            case XmlPullParser.END_TAG:
                break;
        }
        eventType = xmlPullParser.next();
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (null != fileInputStream) {
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

参考文章

  1. Android XML文件结构 和 用XmlPullParser 来解析xml文件

  2. android XmlPullParser 解析stringxml 安卓xml解析方式2种

  3. XmlSerializer简单使用

 历史上的今天

  1. 2023: 抱歉,125啦下架了(0条评论)
  2. 2022: adb shell 发送广播带包名(0条评论)
  3. 2019: 冯骥才:青云楼主(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

[代码片]属性动画之无限旋转

前言简单记录一下而已,正文private ObjectAnimator mRotation = null;mRotation = ObjectAnimator.ofFloat(view, "rotation", 0, 360);mRotation.setDuration(2000);//...

[摘]Handler内存泄露原理及解决方法

SHUI知道本想总结,也懒了,看网上也有很多人总结,也就摘抄于此,以供自己查阅。前言因为Android采取了单线程UI模型,开发者无法在子线程中更新UI,为此Android为我们提供了Handler这个工具,可以开发者切换到主线程更新UI。示例首先看一段示例代码public class...

李娟:我的阿勒泰,有大雪五亩

今年春天,把家从富蕴县南面戈壁滩上的阿克哈拉搬到了阿勒泰市,在红墩乡买了个小产权房,院子很大,五亩!为了充分炫耀此事,我四处呟喝,组织了一拔又一拔看房团前来参观。一到地方,大家除了尖叫和眼红,都不约而同地问了一个问题:“那冬天怎么扫雪?”在阿勒泰的冬天,人人都得扫雪。乡下人扫自家的院子,城里人扫各...

冰心:一日的春光

去年冬末,我给一位远方的朋友写信,曾说:“我要尽量的吞咽今年北平的春天。”今年北平的春天来的特别的晚,而且在还不知春在哪里的时候,抬头忽见黄尘中绿叶成荫,柳絮乱飞,才晓得在厚厚的尘沙黄幕之后,春还未曾露面,已悄悄的远引了。天下事都是如此——去年冬天是特别的冷,也显得特别的长。每天夜里,灯下孤坐...

蒙田:热爱生命

我对某些词语赋予特殊的含义,拿“度日”来说吧,天色不佳,令人不快的时候,我将“度日”看成是“消磨光阴”。而风和日丽的时候,我却不愿意去“度”,这时候我是在慢慢赏玩,领略美好的时光。坏日子,要飞快“度”过去!好日子,要停下来细细品尝。“度日”和“消磨时光”的常用语令人想起那些“哲人”的习气。他们以为...

ToolBar的简单使用

前言上一篇《ActionBar中Menu使用》介绍的是主题样式中默认显示ActionBar,这种有局限性不好自定义。因此我们主题样式中隐藏NoActionBar,使用ToolBar来定制更多的选项。正文# 带ActionBarTheme.MaterialComponents.Light...