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

作者:低调小一 时间:2022-09-21 22:48:40 

本文实例讲述了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,XmlPullParser
0
投稿

猜你喜欢

  • 全面解析Android之ANR日志

    2023-12-18 23:30:21
  • 详解Spring boot/Spring 统一错误处理方案的使用

    2023-11-24 12:56:07
  • java.lang.NoClassDefFoundError错误解决办法

    2021-12-29 03:52:27
  • java转树形结构工具类详解

    2021-07-26 04:00:08
  • 学习C#静态函数及变量的一个精典例子与代码

    2021-10-08 18:53:52
  • 基于Spring Security前后端分离的权限控制系统问题

    2022-10-16 21:32:39
  • Spring Boot 集成Redisson实现分布式锁详细案例

    2023-06-10 05:09:17
  • Java中启动线程start和run的两种方法

    2023-09-12 10:58:29
  • Spring通过<import>标签导入外部配置文件

    2023-03-04 06:43:58
  • Android EditText限制输入字符类型的方法总结

    2023-10-11 15:48:19
  • SpringBoot文件分片上传的示例代码

    2023-06-18 11:30:15
  • Spring Cloud 网关服务 zuul 动态路由的实现方法

    2022-04-09 20:17:46
  • SpringBoot如何优雅的整合Swagger Api自动生成文档

    2022-08-10 00:49:29
  • 如何使用C#操作幻灯片

    2023-08-27 01:06:01
  • C#如何自定义multipart/form-data的解析器

    2023-12-04 18:59:03
  • Java中StringUtils与CollectionUtils和ObjectUtil概念讲解

    2023-11-29 07:45:38
  • Java多线程 Callable、Future 和FutureTask

    2023-07-24 08:09:23
  • 使用Java8实现模板方法模式的改造

    2021-10-28 23:46:09
  • SpringMVC Mybatis配置多个数据源并切换代码详解

    2023-10-30 15:33:43
  • 详解Android中Handler的使用方法

    2023-05-03 06:35:30
  • asp之家 软件编程 m.aspxhome.com