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屏幕旋转 处理Activity与AsyncTask的最佳解决方案

    Android屏幕旋转 处理Activity与AsyncTask的最佳解决方案

    运行时变更就是设备在运行时发生变化(例如屏幕旋转、键盘可用性及语言)。发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务,以便恢复activity的状态。为此,google提供了三种解决方案,本文将对这三种方案进行逐一介绍。
    2016-12-12
  • Java语言读取配置文件config.properties的方法讲解

    Java语言读取配置文件config.properties的方法讲解

    今天小编就为大家分享一篇关于Java语言读取配置文件config.properties的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Android判断登录情况

    Android判断登录情况

    这篇文章主要介绍了Android判断登录情况,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Android webview用法实例简析

    Android webview用法实例简析

    这篇文章主要介绍了Android webview用法,结合实例形式简单分析了Android中webview的功能、用法与相关注意事项,需要的朋友可以参考下
    2016-01-01
  • Flutter软键盘的原理浅析

    Flutter软键盘的原理浅析

    大家应该都知道目前Flutter官方是没有自定义键盘的解决方案,下面这篇文章主要给大家介绍了关于Flutter软键盘原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Android集成百度地图开发流程和注意事项

    Android集成百度地图开发流程和注意事项

    现在很多项目都需要集成百度地图,所以就把自己做过一个项目的经验写出来和大家分享,方便自己和大家使用的时候参考借鉴,下面就来一起看看Android集成百度地图开发流程和注意事项吧。
    2016-09-09
  • Android无需读写权限通过临时授权读写用户文件详解

    Android无需读写权限通过临时授权读写用户文件详解

    这篇文章主要为大家介绍了Android无需读写权限通过临时授权读写用户文件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android TextWatcher监控EditText中的输入内容并限制其个数

    Android TextWatcher监控EditText中的输入内容并限制其个数

    本篇文章主要介绍了Android TextWatcher监控EditText中的输入内容并限制其个数,我们可以通过TextWatcher去观察输入框中输入的内容,有兴趣的可以了解一下。
    2017-04-04
  • Android自定义scrollView实现顶部图片下拉放大

    Android自定义scrollView实现顶部图片下拉放大

    这篇文章主要为大家详细介绍了Android自定义scrollView实现顶部图片下拉放大,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • android图像绘制(五)画布保存为指定格式/大小的图片

    android图像绘制(五)画布保存为指定格式/大小的图片

    将图片进行编辑(放缩,涂鸦等),最后保存成指定格式、大小的图片,接下来将介绍保存方法,感兴趣的朋友可以了解下啊
    2013-01-01

最新评论