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

目录
相关文章
|
24天前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
405 35
|
1月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
150 0
|
8月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2034 1
|
5月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
255 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
8月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
257 15
|
8月前
|
监控 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) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
787 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
282 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多