Android编程解析XML文件的方法详解【基于XmlPullParser】

 更新时间:2017年07月31日 11:23:57   作者:低调小一  
这篇文章主要介绍了Android编程解析XML文件的方法,结合实例形式分析了Android基于XmlPullParser解析xml文件的相关操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了Android编程解析XML文件的方法。分享给大家供大家参考,具体如下:

前言

在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码。因此,这里也顺道介绍一下XmlPullParser的使用。

XML

XML(eXtensible Markup Language)中文名为可扩展标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。

用途

XML设计用了传送及携带数据信息,不用了表现或展示数据,HTML语言则用了表现数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。

丰富文件——自定文件描述并使其更丰富
元数据——描述其它文件或网络资讯
配置文档——描述软件设置的参数

结构

每个XML文档都由XML序言开始,在前面的代码中第一行就是XML序言,<?xml version="1.0"?>。这一行代码会告诉解析器或浏览器这个文件应该按照XML规则进行解析。但是,根元素的名称是由文档类型定义或XML纲要定义的。

XmlPullParser

PULL解析xml是基于事件驱动的方式解析XML文件,pull开始解析时,我们可以先通过getEventType()方法获取当前解析事件类型,并且通过next()方法获取下一个解析事件类型。PULL解析器提供了START_DOCUMENT(开始文档)、END_DOCUMENT(结束文档)、START_TAG(开始标签)、END_TAG(结束标签)四种事件解析类型。当处于某个元素时,可以调用getAttributeValue()方法获取属性的值,也可以通过nextText()方法获取本节点的文本值。下面通过一个例子来进行解析。

xml示例文件

需要解析的xml示例文件代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<colleagues>
  <colleague id="1">
    <name>耗子</name>
    <age>24</age>
    <sex>boy</sex>
  </colleague>
  <colleague id="2">
    <name>璐璐</name>
    <age>28</age>
    <sex>girl</sex>
  </colleague>
  <colleague id="3">
    <name>陈善</name>
    <age>26</age>
    <sex>boy</sex>
  </colleague>
</colleagues>

XmlPullParser解析器

package com.example.shakedemo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.R.xml;
import android.util.Log;
import android.util.Xml;
public class XmlPullParserHelper {
  public static List<Colleague> getColleagues(String xmlFilePath) {
    List<Colleague> colleagues = new ArrayList<Colleague>();
    FileReader xmlReader = null;
    try {
      xmlReader = new FileReader(new File(xmlFilePath));
    } catch (FileNotFoundException e) {
      Log.e("wzy", "Couldn't find xml file " + xmlFilePath);
      return colleagues;
    }
    try {
      // 方式1: 使用 Android 提供的android.util.Xml 类获取 parser 对象
      XmlPullParser parser = Xml.newPullParser();
      // 方式2: 使用工厂类 XmlPullParserFactory
      // XmlPullParserFactory pullFactory =
      // XmlPullParserFactory.newInstance();
      // XmlPullParser parser = pullFactory.newPullParser();
      // 设置文件输入流
      parser.setInput(xmlReader);
      // 得到当前事件类型
      int eventType = parser.getEventType();
      Colleague colleague = null;
      while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
        case XmlPullParser.START_DOCUMENT:
          break;
        case XmlPullParser.START_TAG:
          /**
           * 通过getName判断读到哪个标签, 然后通过nextText获取文本节点值,
           * 或者通过getAttributeValue(i)获取属性节点值
           */
          String name = parser.getName();
          if ("colleague".equals(name)) {
            colleague = new Colleague();
            colleague.setId(Integer.parseInt(parser.getAttributeValue(null, "id")));
          } else if ("name".equals(name)) {
            if (colleague != null) {
              colleague.setName(parser.nextText());
            }
          } else if ("age".equals(name)) {
            if (colleague != null) {
              colleague.setAge(Integer.parseInt(parser.nextText()));
            }
          } else if ("sex".equals(name)) {
            if (colleague != null) {
              colleague.setSex(parser.nextText());
            }
          }
          break;
        case XmlPullParser.END_TAG:
          if ("colleague".equals(parser.getName()) && colleague != null) {
            colleagues.add(colleague);
            colleague = null;
          }
          break;
        }
        eventType = parser.next();
      }
      xmlReader.close();
    } catch (XmlPullParserException e) {
      // Do nothing
    } catch (IOException e) {
      // Do nothing
    }
    return colleagues;
  }
}

其中,colleague类的定义比较简单,代码如下:

package com.example.shakedemo;
public class Colleague {
  private int id;
  private int age;
  private String name;
  private String sex;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  @Override
  public String toString() {
    return "ID is " + id + ", Name is " + name + ", Sex is " + sex;
  }
}

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson

在线格式化XML/在线压缩XML
http://tools.jb51.net/code/xmlformat

XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress

XML代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android操作XML数据技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》、《Android文件操作技巧汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

相关文章

  • 解决Android Studio日志太长或滚动太快问题

    解决Android Studio日志太长或滚动太快问题

    这篇文章主要介绍了解决Android Studio日志太长或滚动太快问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 教你一文搞懂Kotlin中的Jvm注解

    教你一文搞懂Kotlin中的Jvm注解

    这篇文章主要介绍了教你一文搞懂Kotlin中的Jvm注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Android使用PowerImageView实现播放强大的ImageView动画效果

    Android使用PowerImageView实现播放强大的ImageView动画效果

    今天我们就来编写一个PowerImageView控件,让它既能支持ImageView控件原生的所有功能,同时还可以播放GIF图片
    2018-05-05
  • Android中基于XMPP协议实现IM聊天程序与多人聊天室

    Android中基于XMPP协议实现IM聊天程序与多人聊天室

    这篇文章主要介绍了Android中基于XMPP协议实现IM聊天程序与多人聊天室的方法,XMPP基于XML数据格式传输,一般用于即时消息(IM)以及在线现场探测,需要的朋友可以参考下
    2016-02-02
  • Android自定义实现可滑动按钮

    Android自定义实现可滑动按钮

    这篇文章主要为大家详细介绍了Android自定义实现可滑动的按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 解决eclipse启动时报错Failed to create the Java Virtural Machine.问题的方法

    解决eclipse启动时报错Failed to create the Java Virtural Machine.问题的

    这篇文章主要介绍了解决eclipse启动时报Failed to create the Java Virtural Machine.问题的方法,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • android自定义加减按钮

    android自定义加减按钮

    这篇文章主要为大家详细介绍了android自定义加减按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Android基本游戏循环实例分析

    Android基本游戏循环实例分析

    这篇文章主要介绍了Android基本游戏循环,以完整实例形式较为详细的分析了Android实现基本游戏循环的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android结合xml实现帧动画

    Android结合xml实现帧动画

    将一组动作相近的图片组合在一起,然后按照一定的时间来播放,就会形成一个动画,我们可以称之为帧动画。在 Android 中可通过结合 xml 的方式来轻松实现。
    2021-05-05
  • Android证书安装过程介绍

    Android证书安装过程介绍

    大家好,本篇文章主要讲的是Android证书安装过程介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论