首页 > 编程 > Java > 正文

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

2019-11-26 15:02:29
字体:
来源:转载
供稿:网友

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表