在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;
    } 

  }
(0)

相关推荐

  • Android中使用pull解析器操作xml文件的解决办法

    一.使用Pull解析器读取XML文件 除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件. Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE.如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件.android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的. Pull解析器的运行方式与SAX 解析器相似.

  • Android开发之XML文件解析的使用

    前言  本文主要介绍在Android中怎样来解析XML文件.主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包.作为接口,SAX是事件驱动型XML解析的一个标准接口.XML文件解析一般有2种方法,DOM和SAX.其中DOM需要先将xml文档全部读入到电脑内存中,当文档内容太大时,该方法并不适用.SAX就比较好的解决了该问题,它是逐行解析的,可以随时中断.但是SAX的操作比较复杂.因此,这2种方法各有优缺点,看具体应用情况.在前面的文章Qt学习

  • Android中使用sax解析xml文件的方法

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用

  • android编程之XML文件解析方法详解(附源码)

    本文实例讲述了android编程之XML文件解析方法.分享给大家供大家参考,具体如下: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8

  • android开发基础教程—三种方式实现xml文件解析

    1.sax方式 复制代码 代码如下: /** * 使用sax解析 */ public class SaxParse{ /** * sax解析器 */ private SAXParser parser; public SaxParse(){ try { SAXParserFactory f = SAXParserFactory.newInstance(); parser = f.newSAXParser(); } catch (ParserConfigurationException e) { e

  • 基于Android XML解析与保存的实现

    解析XML文件:在Android平台上可以使用SAX.DOM和Android附带的pull解析器解析XML文件:pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理:通过paser.nextText()方法可以获取下一个Text类型的节点的值:http://xmlpull.org/xmlpull-website/impls.shtml; 读取XMLXmlPullParser p

  • Android开发之DOM解析xml文件的方法

    本文实例讲述了Android中DOM解析xml文件的方法.分享给大家供大家参考,具体如下: 一.在assets文件中写xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <pe

  • Android XML数据解析简单示例

    1.创建XML数据 在android工程目录中res/目录下创建raw文件夹,在raw文件夹内创建data.xml. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <data>     <class>         <c studentNum="1">Android</c>         <c studentNum=&quo

  • android通用xml解析方法

    1.为什么需要写一个通用xml解析方法. 当需要解析不同的xml节点.你有可能是在xml解析的时候匹配不同节点并且节点名都是写死的,这样的话你解析不同的节点就需要不同的解析方法.当然这种方式是最简单也是最笨的方法.为了减少代码把代码写得更有质量那么你就需要考虑设计一个通用的xml解析方法. 2.解析思路. 一般情况下,xml的解析结果最好放在一个实体类对象中,那样的话你使用起来非常方便(当然也更OO了),你也可以选择其他的方法把解析结果保存下来,不过个人觉得这种方式是比较好的.在解析过程中你需要

  • Android使用Pull解析器解析xml文件的实现代码

    2个类:1个实体类Person.java,1个继承Activity的类 1.Person.java 复制代码 代码如下: package com.mrzhu.work_1_sax; public class Person { private String personId; private String name; private String address; private String tel; private String fax; private String email; publi

随机推荐