首页 > 系统 > Android > 正文

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

2019-12-12 02:21:52
字体:
来源:转载
供稿:网友

本文实例讲述了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.VeVB.COm/code/xmljson

在线格式化XML/在线压缩XML
http://tools.VeVB.COm/code/xmlformat

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

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

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表