在Android系统中解析XML文件的方法

所属分类: 软件编程 / java 阅读数: 30
收藏 0 赞 0 分享

前言
    在学习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; 
    } 
   
  } 

更多精彩内容其他人还在看

java 中maven pom.xml文件教程详解

这篇文章主要介绍了java 中maven pom.xml文件教程详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

spring boot整合netty的实现方法

这篇文章主要介绍了spring boot整合netty的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Netty与Spring Boot的整合实现

这篇文章主要介绍了Netty与Spring Boot的整合的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring动态加载bean后调用实现方法解析

这篇文章主要介绍了Spring动态加载bean后调用实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现画图板上画一条直线

这篇文章主要为大家详细介绍了java实现画图板上画一条直线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java通过python命令执行DataX任务的实例

今天小编就为大家分享一篇Java通过python命令执行DataX任务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

springBoot集成redis的key,value序列化的相关问题

这篇文章主要介绍了springBoot集成redis的key,value序列化的相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

java实现登录案例

这篇文章主要为大家详细介绍了java实现登录案例的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java解决请求跨域的两种方法

这篇文章主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringBoot集成Beetl后统一处理页面异常的方法

这篇文章主要介绍了SpringBoot集成Beetl后统一处理页面异常的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享
查看更多