作者:李波
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文件中对应的数据项元素如下:
首先需要初始化一个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() |
获取当前元素的名字 |
如读取到 |
nextText() |
返回当前元素所对应的文本值 |
如事件为 |
getAttributeName(int index) |
获取当前元素中属性名 |
如tag |
getAttributeValue(int index) |
获取当前元素中属性的值 |
如 "item1" |
解析步骤:
1) 初始化parser,指定xml文件
2) 读取文档开始标识,根元素
3) 读取数据项元素开始标识,
a) 读取数据项元素的属性,tag="item1"
b) 读取数据项的子元素,id,name,age,height
4) 一个数据项结束,,保存该数据项的结果
5) 读取文档结束标识,
写入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后被调用 |
|
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) 写入文档开始标记
4) 写入根元素
5) 写入数据项元素
a) 写入数据项属性tag=”people1”
b) 写入数据项子元素,id,name,age,height
6) 写入数据项元素结束符
7) 写入根元素结束符
8) 写入文档结束符
9) 通过writer将数据写入文件,writer.flush()
10) 关闭writer对象
实现工具类XmlPullHelper,提供对XML文件解析和写入的
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用于保存从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); }