当前位置: 首页 > news >正文

Android之使用Pull方式解析与保存XML文件操作

1.XmlPullParser解析XML,解析方式与SAX类似,提供类似的事件触发方式,需要使用parser.next()方式来提取他们,通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理,当某个元素开始的,可以调用Parser.nextText()从XML文件中提取所有的字符数据。

2.Person.xml

<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>liming</name> <age>30</age> </person> <person id="20"> <name>lixiangmei</name> <age>25</age> </person> </persons>

3.XmlPullParser解析XML与保存XML文件

public class PULLPersonParser { //使用PULL技术保存XML文件方法 public static void save(List<Person> persons, Writer writer) throws Throwable { //得到XmlSerializer对象 XmlSerializer serializer = Xml.newSerializer(); //通过写入器接口 serializer.setOutput(writer); //开始文档标记 serializer.startDocument("UTF-8", true); //开始标签persons serializer.startTag(null, "persons"); //开始迭代 for(Person person : persons) { //开始标签person serializer.startTag(null, "person"); //标签person属性 serializer.attribute(null, "id", person.getId().toString()); //子节点,元素name serializer.startTag(null, "name"); serializer.text(person.getName()); serializer.endTag(null, "name"); //子节点,元素age serializer.startTag(null, "age"); serializer.text(person.getAge().toString()); serializer.endTag(null, "age"); //结束标签person serializer.endTag(null, "person"); } //结束标签persons serializer.endTag(null, "persons"); //结束文档标记 serializer.endDocument(); writer.flush(); writer.close(); } //采用XmlPullParser来解析XML文件 public static List<Person> getPersons(InputStream inStream) throws Throwable { List<Person> persons = null; Person person = null; //获取一个XmlPullParser XmlPullParser parser = Xml.newPullParser(); //解析文件输入流 parser.setInput(inStream, "UTF-8"); //产生第一个事件 int eventType = parser.getEventType(); //只要不是文档结束事件,就一直循环 while(eventType!=XmlPullParser.END_DOCUMENT) { switch (eventType) { //触发开始文档事件 case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Person>(); break; //触发开始元素事件 case XmlPullParser.START_TAG: //获取解析器当前指向的元素的名称 String name = parser.getName(); if("person".equals(name)) { //通过解析器获取id的元素值,并设置person的id person = new Person(); person.setId(new Integer(parser.getAttributeValue(0))); } if(person!=null) { if("name".equals(name)) { //获取解析器当前指向元素的下一个文本节点的值,会返回 person.setName(parser.nextText()); } if("age".equals(name)) { //获取解析器当前指向元素的下一个文本节点的值,会返回 person.setAge(new Short(parser.nextText())); } } break; //触发结束元素事件 case XmlPullParser.END_TAG: // if("person".equals(parser.getName())) { persons.add(person); person = null; } break; default: break; } eventType = parser.next(); } return persons; } }

相关文章:

  • 『cs231n』绪论
  • 【Android】数据存储之SharedPreferences
  • Servlet的生命周期
  • 【Android】数据存储之SQLite
  • Linux 超级用户和普通用户切换命令
  • Android数据存储SQLite - 事务操作
  • 第二阶段冲刺--团队站立会议05
  • Android数据显示之ListView
  • String、StringBuffer、StringBuilder比较
  • Android数据存储之ContentProvider
  • [BZOJ 3680]吊打XXX(模拟退火)
  • 可达性分析算法-确定那些对象是垃圾(转)
  • Android之使用ContentResolver对通信录中的数据进行简单操作
  • Android之网络操作 - 从网络获取图片或网页
  • OpenGL学习--开发环境
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 10个确保微服务与容器安全的最佳实践
  • co模块的前端实现
  • gf框架之分页模块(五) - 自定义分页
  • Git学习与使用心得(1)—— 初始化
  • JS字符串转数字方法总结
  • Making An Indicator With Pure CSS
  • Material Design
  • Tornado学习笔记(1)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 近期前端发展计划
  • 精彩代码 vue.js
  • 前端
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • nb
  • ​虚拟化系列介绍(十)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #预处理和函数的对比以及条件编译
  • $.ajax中的eval及dataType
  • (3)STL算法之搜索
  • (HAL库版)freeRTOS移植STMF103
  • (三)uboot源码分析
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Linq学习笔记
  • (转)详解PHP处理密码的几种方式
  • . Flume面试题
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @property python知乎_Python3基础之:property
  • @拔赤:Web前端开发十日谈
  • [C++]指针与结构体
  • [ES-5.6.12] x-pack ssl
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • [JavaWeb学习] Spring Ioc和DI概念思想
  • [leetcode] Balanced Binary Tree
  • [LeetCode] Wildcard Matching