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

  }
时间: 2015-07-30

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解析与保存的实现

解析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通用xml解析方法

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

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中使用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 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使用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

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

JavaScript常用截取字符串的三种方式用法区别实例解析

stringObject.substring(start,stop) 用于提取字符串中介于两个指定下标之间的字符. start必需.一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置. stop可选.一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1.如果省略该参数,那么返回的子串会一直到字符串的结尾. start从0开始 到stop(不包含stop)结束 不接受负的参数. stringObject.substr(start,

Android平台基于Pull方式对XML文件解析与写入方法详解

本文详细讲述了Android平台基于Pull方式对XML文件解析与写入方法.分享给大家供大家参考,具体如下: XML技术在跨平台的情况下的数据交互中得到了广泛的应用,假如我们需要开发一个Android应用程序,需要同服务器端进行数据交互,通过XML文件可以很方便的在Android平台和服务器之间进行数据传输,具体实现涉及到对XML文件进行解析及写入的技术.本文实现在Android平台上基于Pull方式对XML文件解析的技术. XmlPullParser是一个Java实现的开源API包(源码下载地

Android播放视频的三种方式

在Android中,我们有三种方式来实现视频的播放: 1).使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2).使用VideoView来播放.在布局文件中使用VideoView结合MediaController来实现对其控制. 3).使用MediaPlayer类和SurfaceView来实现,这种方式很灵活. 1.调用其自带的播放器: Uriuri = Uri.parse(Environment.getExternalStorageD

android开发基础教程—打电话发短信

打电话发短信demo 复制代码 代码如下: public class MainActivity extends Activity { EditText mPhoneNum,mMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPhoneNum=(Edit

android开发基础教程—SharedPreferences读写

复制代码 代码如下: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View v) { switch (v.getId()) { ca

android开发基础教程—文件存储功能实现

文件存储: 复制代码 代码如下: public class MainActivity extends Activity { EditText mname, mage; TextView mtv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mname = (Edit

Android中对xml文件解析的3种方式总结

前言 xml 是数据传输的一种格式,Android 中的布局文件.设置文件等都采用它来表示.Android 中对 xml 文件的解析也有多种方式,下面介绍常用的 3 种方式: Dom . SAX 和 dom4j.下面话不多说了,来一起看看详细的介绍吧. 先看一个简单的 xml 文件: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <书 出版社="骏马&qu

iOS开发定时器的三种方法分享

前言 在开发中,很多时候我们需要用到定时器实时刷新某个数值.这个时候我们就需要用到定时器,这里,我为大家推荐三种方法,分别是:NSTimer.CADisplayLink.GCD.接下来我就一一介绍它们的用法.希望能帮到大家. 一.NSTimer(一般用于定时的更新一些非界面上的数据) 1. 创建方法 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:

记录Android studio JNI开发的三种方式(推荐)

概述 在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼.从Andorid Studio支持JNI开发后,让我们开发JNI变的如此简单. NDK 和 JNI介绍 JNI (Java Native Interface)是一套编程接口,用来实现Java代码和其他语言(c.C++或汇编)进行交互.这里需要注意的是JNI是JAVA语言自己的特性,也就是说JNI和Android没有关系.在Windows下面用JAVA做开发也经常会用到JNI,