软件编程
位置:首页>> 软件编程>> Android编程>> Android编程解析XML文件的方法详解【基于XmlPullParser】

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

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

标签:Android,XML,XmlPullParser

本文实例讲述了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程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com