Android平台基于Pull方式对XML文件解析与写入方法详解
作者:pku_android 发布时间:2021-07-21 01:52:52
本文详细讲述了Android平台基于Pull方式对XML文件解析与写入方法。分享给大家供大家参考,具体如下:
XML技术在跨平台的情况下的数据交互中得到了广泛的应用,假如我们需要开发一个Android应用程序,需要同服务器端进行数据交互,通过XML文件可以很方便的在Android平台和服务器之间进行数据传输,具体实现涉及到对XML文件进行解析及写入的技术。本文实现在Android平台上基于Pull方式对XML文件解析的技术。
XmlPullParser是一个Java实现的开源API包(源码下载地址http://www.xmlpull.org/),实现了pull方式解析xml文件的方法, Android SDK中包含了该API,使用时需要导入以下三个包:
import org.xmlpull.v1.XmlPullParser;//包含解析XML文件类的包
import org.xmlpull.v1.XmlPullParserException;//处理异常
importorg.xmlpull.v1.XmlSerializer;//包含写入XML文件类的包
我们以SQLite数据库课堂练习中的数据类People为例,People类有4个属性:ID,Name,Age,Height,假设有一条测试数据ID=1,Name=”杜甫”,Age=30,Height=1.75,
在XML文件中对应的数据项元素如下:
<peopleinfo>
<peopletag="item1">
<id>1</id>
<name>杜甫</name>
<age>30</age>
<height>1.75</height>
</people>
</peopleinfo>
1. 使用XmlPullParser对该文件解析
首先需要初始化一个XmlPullParser对象parser,R.xml.peopleinfo为文件peopleinfo.xml在项目中的标识,读入该文件后一步一步对文件中的元素进行解析。
XmlPullParser parser= getResources().getXml(R.xml.peopleinfo);
XmlPullParser的相关函数及说明如下:
相关函数或变量 | 说明 | 示例 |
XmlPullParser.START_DOCUMENT | 文档开始标识,根元素 | <peopleinfo> |
XmlPullParser.END_DOCUMENT | 文档结束标识 | </peopleinfo> |
XmlPullParser.START_TAG | 元素开始标识 | <people> |
XmlPullParser.END_TAG | 元素结束标识 | </people> |
getEventType() | 获取当元素的类型 (如START_TAG, END_TAG, TEXT, etc.) | 如<peopleinfo> 的类型为START_DOCUMENT |
next() | 获取下一个待解析元素 | 事件表示<>括号中的一个项 |
getName() | 获取当前元素的名字 | 如读取到<age>,返回值为”age” |
nextText() | 返回当前元素所对应的文本值 | 如事件为<height>时,返回1.75 |
getAttributeName(int index) | 获取当前元素中属性名 | 如tag |
getAttributeValue(int index) | 获取当前元素中属性的值 | 如"item1" |
解析步骤:
1) 初始化parser,指定xml文件
2) 读取文档开始标识,根元素<peopleinfo>
3) 读取数据项元素开始标识, <people>
a) 读取数据项元素的属性,tag="item1"
b) 读取数据项的子元素,id,name,age,height
4) 一个数据项结束,</people>,保存该数据项的结果
5) 读取文档结束标识,</peopleinfo>
2. 使用XmlSerializer对写XML文件
写入XML文件的过程:先初始化一个XmlSerializer对象serializer,设置输出的Writer对象,然后数据写入serializer中,再将该对象通过Writer写入文件。
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(writer);
//…
writer.flush()
XmlSerializer的相关函数及说明如下:
相关函数 | 说明 | 示例 |
setOutput(Writer writer) | 设置输出的Writer对象 |
|
startDocument(String encoding, Boolean standalone); | 写入XML文件的起始标识语句,必须在setOutput后被调用 | <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> |
startTag(String namespace, String name); | 写入开始元素标识 | 如<people>,<age> |
attribute(String namespace, String name, String value); |
| 如tag=”people1” |
text(String text) | 写入元素值 | 如:杜甫 |
endTag(String namespace, String name) | 写入元素结束标识 | 如</people>,</age> |
endDocument(); | 写入文档结束标记 |
|
写入步骤:
1) 初始化serializer
2) 设置Writer对象writer
3) 写入文档开始标记<?xml version="1.0" encoding="UTF-8"standalone="yes" ?>
4) 写入根元素<peopleinfo>
5) 写入数据项元素<people>
a) 写入数据项属性tag=”people1”
b) 写入数据项子元素,id,name,age,height
6) 写入数据项元素结束符</people>
7) 写入根元素结束符</peopleinfo>
8) 写入文档结束符
9) 通过writer将数据写入文件,writer.flush()
10) 关闭writer对象
实现工具类XmlPullHelper,提供对XML文件解析和写入的
1. 具体实现,代码如下:
package aaron.android.SQLiteDamon;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import android.util.Log;
public class XmlPullHelper {
private XmlPullParser parser;
private XmlSerializer serializer;
private ArrayList<Map<String, Object>> contents=new ArrayList<Map<String,Object>>();
private Map<String,Object> map=null;
public XmlPullHelper(XmlPullParser parser,XmlSerializer serial){
this.parser=parser;
this.serializer = serial;
}
/**
* 将xml文件中的所有节点的数据解析后保存在一个ArrayList中返回
* @param nodeName:数据项的名称,这里为"people"
* @param attr:数据项的属性,如id,name,age,height
* @return 解析该xml文件数据的结果
* @throws XmlPullParserException
* @throws IOException
*/
public ArrayList<Map<String,Object>> xmlPull(String nodeName,String[] attr) throws XmlPullParserException, IOException{
//循环读取所有的元素
while(parser.next()!=XmlPullParser.END_DOCUMENT){
switch(parser.getEventType()){
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:{ //元素开始标识
//判断是否为所需要的数据项,如果是,在初始化一个map用于保存该数据项的值
if(parser.getName()!=null&&parser.getName().equals(nodeName)){
map=new HashMap<String, Object>();
//循环读取该元素中所有的属性
for(int j=0;j<parser.getAttributeCount();j++)
map.put(parser.getAttributeName(j), parser.getAttributeValue(j));//添加属性的值,如tag="item1"
}
else if(map!=null){
for(int i=0;i<attr.length;i++){
if(parser.getName()!=null&&parser.getName().equals(attr[i])){//添加子元素的值,如<name>张三</name>
map.put(attr[i],parser.nextText());
}
}
}
break;
}
case XmlPullParser.END_TAG: {//元素结尾标识
//判断是否为一个数据项的结束,如果是,将该数据项的数据添加到数据集contents中
if(parser.getName().equals(nodeName)&&map!=null){
contents.add(map);
map=null;
}
break;
}
}
}
return contents;
}
/**
* 将给定的数据集写入XML文件
* @param fileName: 根元素名,默认设为跟文件名相同,如"peopleinfo"
* @param nodeName: 数据项名 如"people"
* @param attr: 数据项的属性 如id,name,age,height
* @param con: 待写入的数据集
* @throws XmlPullParserException
* @throws IOException
*/
public void xmlWrite(String fileName,String nodeName,String[] attr,ArrayList<Map<String,Object>> con) throws XmlPullParserException, IOException{
serializer.startDocument("UTF-8", true);
serializer.startTag(null, fileName);//开始根元素标签<peopleinfo>
for(int i=0;i<con.size();i++)
{
//开始元素标签<people>
serializer.startTag(null, nodeName);
//标签people属性
serializer.attribute(null, "tag", "people"+i);
//循环将子节点写入元素id,name,age,height
for(int j=0;j<attr.length;j++)
{
serializer.startTag(null, attr[j]);
serializer.text(con.get(i).get(attr[j]).toString());
serializer.endTag(null, attr[j]);
}
//结束标签</people>
serializer.endTag(null, nodeName);
}
//结束标签</peopleinfo>
serializer.endTag(null, fileName);
//结束文档标记
serializer.endDocument();
}
}
1. 使用该工具类XmlPullHelper具体实现
//定义数据集对象contents用于保存从XML文件中读取的数据
ArrayList<Map<String, Object>> contents = null;
//将数据写入XML文件,并保存到SD卡中
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录
File saveFile = new File(sdCardDir, "peopleinfo.xml");
FileWriter w=new FileWriter(saveFile);
XmlSerializer serializer = Xml.newSerializer();
XmlPullHelper xHelper=new XmlPullHelper(null,serializer);
//待写入的子元素标签
String []items={"id","name","age","height"};
//将Writer对象传递给 serializer
serializer.setOutput(w);
xHelper.xmlWrite("peopleinfo", "people", items, contents);//调用写入方法
w.flush(); //将serializer中数据写入文件
w.close();
}
//读XML文件,解析并保存在数据集contents
XmlPullParser parser = getResources().getXml(R.xml.peopleinfo);
XmlPullHelper xHelper=new XmlPullHelper(parser,null);
String []items={"id","name","age","height"};
try{
contents=xHelper.xmlPull("people", items);//调用解析方法
}
catch(Exception e){
Log.e("XmlPullParser",e.getMessage(),e);
}
Android SDK内置了Pull解释器,使用XmlPullParser比较方便,解析XML文件的技术还有很多种,如 SAX和DOM,还需要更多的学习。
希望本文所述对大家Android程序设计有所帮助。
猜你喜欢
- xml中: <ImageView &nb
- 第三章 字符串,比较器和过滤器JDK引入的一些方法对写出函数式风格的代码很有帮助。JDK库里的一些的类和接口我们已经用得非常熟悉了,比如说S
- 准备工作HALCON示例程序的描述部分一直是英文的,看起来很不方便。我决定汉化一下HALCON示例程序的描述,准备工作如下:拿到HALCON
- 创建项目首先创建一个空项目!!!注意是空项目!!!点击 文件->新建->新模块 ,新建一个名称为 servlet02 的模块(注
- TIOBE 11 月编程语言排行榜,Python 逆袭C#曾经有一段时间,脚本语言因其易于编写和易于运行的特性,被预测在未来将发展强大。因此
- 通过邮件找回密码功能的实现1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是
- https://www.jb51.net/article/191716.htm 此篇博文对flyway讲解的很清楚了,我在这只是稍
- Java Resource路径首先一点很重要,Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝
- 本文实例讲述了Android编程之防止反编译的实现方法。分享给大家供大家参考,具体如下:1. 判断程序是否运行在模拟器上boolean is
- 一、什么是JMSJMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(M
- 一、CORS概述跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明那些来源可以通过浏览器访问该服务器上的各类资源(包括CSS、图片
- 一. 方法重写在面向对象中,实现多态的必备条件是继承、重写和向上转型,现在我们已经学习了什么是继承。接下来我们再来学习什么是方法重写,这是我
- 主要代码:(有注释)package com.example.checkboxtest;import android.annotation.S
- 本文实例为大家分享了Unity实现手势识别的具体代码,供大家参考,具体内容如下代码很简单没有难度,都有注解,随便 看一看 就会了。
- Java关于Map的四种取值方式map的主要作用是什么?可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数
- 本文实例讲述了Android开发Wifi的基础知识。分享给大家供大家参考。具体如下:Android提供了WifiManager这个类,通过这
- 实际需求<if test="computationRule == '1'"> F
- 前言:有时候我们在用Spring Aop面向切面编程,需要获取连接点(JoinPoint)方法参数名、参数值。环境:Mac OSXIntel
- 本篇主要总结下Spring容器在初始化实例前后,提供的一些回调方法和可扩展点。利用这些方法和扩展点,可以实现在Spring初始化实例前后做一
- spring boot RestTemplate 发送get请求踩坑闲话少说,代码说话RestTemplate 实例手动实例化,这个我基本不