Android使用pull解析xml

简介: 一、理论准备     Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。

一、理论准备

    Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

    工程结构如下:

                      image

    为什么把xml放在assets目录下呢,它和res/values目录的区别是系统不分配ID,好像没解决问题,暂时没查到资料。

二、上代码

 
package com.example.and_0003;
 
import java.io.InputStream;
import java.util.List;
 
import com.hpu.entity.Student;
import com.hpu.util.PullService;
 
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
 
public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        AssetManager asset = getAssets();
        try {
            InputStream input = asset.open("student.xml");
            List<Student> list = PullService.getStudents(input);
            for (Student stu : list) {
                   Log.e("StudentInfo","Person ID: " + stu.getId() + ","
                         + stu.getName() + ", " + stu.getAge() + ", "
                         + stu.getSex());
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

 
  1: <?xml version="1.0" encoding="utf-8"?>
  2: <students>
  3:   <student id="20110806100">
  4:     <name>小明</name>
  5:     <age>22</age>
  6:     <sex></sex>
  7:   </student>
  8:   <student id="20110806101">
  9:     <name>小李</name>
 10:     <age>24</age>
 11:     <sex></sex>
 12:   </student>
 13:   <student id="20110806102">
 14:     <name>小丽</name>
 15:     <age>21</age>
 16:     <sex></sex>
 17:   </student>
 18: </students>

package com.hpu.entity;
public class Student {
	
	private String id;
	private String name;
	private int age;
	private String sex;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

}

 
  1: package com.hpu.util;
  2: 
  3: import java.io.InputStream;
  4: import java.util.ArrayList;
  5: import java.util.List;
  6: 
  7: import org.xmlpull.v1.XmlPullParser;
  8: import org.xmlpull.v1.XmlPullParserFactory;
  9: 
 10: import com.hpu.entity.Student;
 11: 
 12: import android.util.Xml;
 13: 
 14: public class PullService {
 15: 
 16:   // 采用XmlPullParser来解析XML文件
 17:   public static List<Student> getStudents(InputStream inStream)
 18:       throws Throwable {
 19:     List<Student> students = null;
 20:     Student mStudent = null;
 21: 
 22:     // ========创建XmlPullParser,有两种方式=======
 23:     // 方式一:使用工厂类XmlPullParserFactory
 24:     XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
 25:     XmlPullParser parser = pullFactory.newPullParser();
 26:     // 方式二:使用Android提供的实用工具类android.util.Xml
 27:     // XmlPullParser parser = Xml.newPullParser();
 28: 
 29:     // 解析文件输入流
 30:     parser.setInput(inStream, "UTF-8");
 31:     // 产生第一个事件
 32:     int eventType = parser.getEventType();
 33:     // 只要不是文档结束事件,就一直循环
 34:     while (eventType != XmlPullParser.END_DOCUMENT) {
 35:       switch (eventType) {
 36:       // 触发开始文档事件
 37:       case XmlPullParser.START_DOCUMENT:
 38:         students = new ArrayList<Student>();
 39:         break;
 40:       // 触发开始元素事件
 41:       case XmlPullParser.START_TAG:
 42:         // 获取解析器当前指向的元素的名称
 43:         String name = parser.getName();
 44:         if ("student".equals(name)) {
 45:           // 通过解析器获取id的元素值,并设置student的id
 46:           mStudent = new Student();
 47:           mStudent.setId(parser.getAttributeValue(0));
 48:         }
 49:         if (mStudent != null) {
 50:           if ("name".equals(name)) {
 51:             // 获取解析器当前指向元素的下一个文本节点的值
 52:             mStudent.setName(parser.nextText());
 53:           }
 54:           if ("age".equals(name)) {
 55:             // 获取解析器当前指向元素的下一个文本节点的值
 56:             mStudent.setAge(new Short(parser.nextText()));
 57:           }
 58:           if ("sex".equals(name)) {
 59:             // 获取解析器当前指向元素的下一个文本节点的值
 60:             mStudent.setSex(parser.nextText());
 61:           }
 62:         }
 63:         break;
 64:       // 触发结束元素事件
 65:       case XmlPullParser.END_TAG:
 66:         //
 67:         if ("student".equals(parser.getName())) {
 68:           students.add(mStudent);
 69:           mStudent = null;
 70:         }
 71:         break;
 72:       default:
 73:         break;
 74:       }
 75:       eventType = parser.next();
 76:     }
 77:     return students;
 78:   }
 79: 
 80: }
 81: 
四、运行结果

             image

五、遗留问题及参考文献

    Dom和SAX和Pull的适用范围分别是什么?

              http://blog.csdn.net/cjjky/article/details/6667744

目录
相关文章
|
2月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
195 1
|
6月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
2月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
89 15
|
2月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
5月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
5月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
6月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
6月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
163 0
|
2月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
255 29
|
2月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
76 4