android 获取xml boolean,Android平台基于Pull方式对XML文件解析与写入方法详解

本文详细讲述了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文件中对应的数据项元素如下:

1

杜甫

30

1.75

1. 使用XmlPullParser对该文件解析

首先需要初始化一个XmlPullParser对象parser,R.xml.peopleinfo为文件peopleinfo.xml在项目中的标识,读入该文件后一步一步对文件中的元素进行解析。

XmlPullParser parser= getResources().getXml(R.xml.peopleinfo);

XmlPullParser的相关函数及说明如下:

相关函数或变量

说明

示例

XmlPullParser.START_DOCUMENT

文档开始标识,根元素

XmlPullParser.END_DOCUMENT

文档结束标识

XmlPullParser.START_TAG

元素开始标识

XmlPullParser.END_TAG

元素结束标识

getEventType()

获取当元素的类型(如START_TAG, END_TAG, TEXT, etc.)

的类型为START_DOCUMENT

next()

获取下一个待解析元素

事件表示<>括号中的一个项

getName()

获取当前元素的名字

如读取到,返回值为”age”

nextText()

返回当前元素所对应的文本值

如事件为时,返回1.75

getAttributeName(int index)

获取当前元素中属性名

如tag

getAttributeValue(int index)

获取当前元素中属性的值

如"item1"

解析步骤:

1)    初始化parser,指定xml文件

2)    读取文档开始标识,根元素

3)    读取数据项元素开始标识,

a)    读取数据项元素的属性,tag="item1"

b)    读取数据项的子元素,id,name,age,height

4)    一个数据项结束,,保存该数据项的结果

5)    读取文档结束标识,

2. 使用XmlSerializer对写XML文件

写入XML文件的过程:先初始化一个XmlSerializer对象serializer,设置输出的Writer对象,然后数据写入serializer中,再将该对象通过Writer写入文件。

XmlSerializer serializer = Xml.newSerializer();

serializer.setOutput(writer);

//…

writer.flush()

XmlSerializer的相关函数及说明如下:

相关函数

说明

示例

设置输出的Writer对象

startDocument(String encoding, Boolean standalone);

写入XML文件的起始标识语句,必须在后被调用

startTag(String namespace, String name);

写入开始元素标识

如,

attribute(String namespace, String name, String value);

如tag=”people1”

text(String text)

写入元素值

如:杜甫

endTag(String namespace, String name)

写入元素结束标识

如,

endDocument();

写入文档结束标记

写入步骤:

1) 初始化serializer

2) 设置Writer对象writer

3) 写入文档开始标记<?xml version="1.0" encoding="UTF-8"standalone="yes" ?>

4) 写入根元素

5) 写入数据项元素

a)  写入数据项属性tag=”people1”

b)  写入数据项子元素,id,name,age,height

6) 写入数据项元素结束符

7) 写入根元素结束符

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> contents=new ArrayList>();

private Map 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> 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();

//循环读取该元素中所有的属性

for(int j=0;j

map.put(parser.getAttributeName(j), parser.getAttributeValue(j));//添加属性的值,如tag="item1"

}

else if(map!=null){

for(int i=0;i

if(parser.getName()!=null&&parser.getName().equals(attr[i])){//添加子元素的值,如张三

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> con) throws XmlPullParserException, IOException{

serializer.startDocument("UTF-8", true);

serializer.startTag(null, fileName);//开始根元素标签

for(int i=0;i

{

//开始元素标签

serializer.startTag(null, nodeName);

//标签people属性

serializer.attribute(null, "tag", "people"+i);

//循环将子节点写入元素id,name,age,height

for(int j=0;j

{

serializer.startTag(null, attr[j]);

serializer.text(con.get(i).get(attr[j]).toString());

serializer.endTag(null, attr[j]);

}

//结束标签

serializer.endTag(null, nodeName);

}

//结束标签

serializer.endTag(null, fileName);

//结束文档标记

serializer.endDocument();

}

}

1. 使用该工具类XmlPullHelper具体实现

//定义数据集对象contents用于保存从XML文件中读取的数据

ArrayList> 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程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值