XmlPullParser简单使用

Android  2024年10月19日 am8:26发布1个月前更新 城堡大人
43 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

海子:面朝大海,春暖花开

从明天起,做一个幸福的人喂马,劈柴,周游世界从明天起,关心粮食和蔬菜我有一所房子,面朝大海,春暖花开 从明天起,和每一个亲人通信告诉他们我的幸福那幸福的闪电告诉我的我将告诉每一个人 给每一条河每一座山取一个温暖的名字陌生人,我也为你祝福愿你有一个灿烂的前程...

朱自清:正义

正义是在我们心理!从明哲的教训和见闻的意义中,我们不是得着大批的正义么?但白白的搁在心里,谁也不去取用,却至少是可惜的事。两石白米搁在屋里,总要吃它干净,两箱衣服堆在屋里,总要轮流穿换,一大堆正义却扔在一旁,满不理会,我们真大方,真舍得!看来正义这东西也真*,竟抵不上白米的一个尖儿,衣服的一个扣儿。...

lateinit和by lazy简单使用

前言记录一下Kotlin中lateinit和by lazy简单使用。正文lateinit为延迟初始化属性。lateinit用于延迟初始化一个var可变属性。属性类型必须是非空的且不能是原始类型(如 Int, Double)。经常在类中定义属性时class Person{   v...

乔叶:畏惧告别

我实际上是个十分口拙的人。而且,特别是在关键时刻尤为口拙。比如告别。告别似乎是一个普遍公认的隆重时刻,也是一个最能够让人感怀的时刻。越是这样的时刻,我就越是畏惧。倒不是怕伤心怕落泪,而是怕说话。——人多还好,你一句我一句也容易混过。最怕人少,尤其是只有两个人的时候,无论语言的茅草多么丰盛,也总会有...

鲁迅 :秋夜

在我的后园,可以看见墙外有两株树,一株是枣树,还有一株也是枣树。这上面的夜的天空,奇怪而高,我生平没有见过这样奇怪而高的天空。他仿佛要离开人间而去,使人们仰面不再看见。然而现在却非常之蓝,闪闪地〖目夹〗着几十个星星的眼,冷眼。他的口角上现出微笑,似乎自以为大有深意,而将繁霜洒在我的园里的野花上。...

MediaPlayer JNI层介绍

前言之前的《MediaPlayer java层介绍》只是介绍了java中的常用方法,对于JNI层的调用没有进一步介绍,今天就介绍一下JNI层。个人流水账哈,推荐看其他人的,我这只是自己的跟踪记录涉及的代码:frameworks\base\media\java\android\media\M...