Android平台基于Pull方式对XML文件解析及写入

标签: android 平台 pull | 发表时间:2012-04-04 14:13 | 作者:pku_android
出处:http://blog.csdn.net

作者:李波

           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,还需要更多的学习。

作者:pku_android 发表于2012-4-4 14:13:11 原文链接
阅读:25 评论:0 查看评论

相关 [android 平台 pull] 推荐:

Android PULL解析XML

- - CSDN博客移动开发推荐文章
int eventType = parser.getEventType();//产生第一个事件. while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件. String name = parser.getName();//获取解析器当前指向的元素的名称.

Android平台基于Pull方式对XML文件解析及写入

- - CSDN博客推荐文章
           XML技术在跨平台的情况下的数据交互中得到了广泛的应用,假如我们需要开发一个Android应用程序,需要同服务器端进行数据交互,通过XML文件可以很方便的在Android平台和服务器之间进行数据传输,具体实现涉及到对XML文件进行解析及写入的技术. 本文实现在Android平台上基于Pull方式对XML文件解析的技术.

android解析XML总结-SAX、Pull、Dom三种方式

- - CSDN博客移动开发推荐文章
     在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式. 最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下:.

关于Pull Request的十个建议

- - 外刊IT评论
Pull Request 是 Bitbucket、 GitHub 等源代码托管系统为了方便开发者之间协作而提供的一个功能,它提供了一个用户友好的 Web 界面来帮助审查人员进行代码审查. 开发人员可以通过 GitHub 发出 Pull Requests 要求请求他人将程序拉下来进行代码审查. 一个好的 Pull Request 不仅仅只是代码的事情,还牵涉到代码审查者对代码的审查,所以开发者不仅要写出好的代码,还必须迎合审查者的审查工作,才能给使得自己贡献的代码顺利通过审查并合并到 master 分支.

Android平台遗弃史

- fyits0 - Solidot
Google上周宣布了Android 4.0 Ice Cream Sandwich和Galaxy Nexus. 对第一代Nexus One用户来说,坏消息是他们的手机不能升级到ICS. 然而相比其它Android用户,他们则要幸运得多. Michael Degusta制作了一幅示意图,显示大部分Android手机运行的系统都较陈旧,远落后于最新版本,而且一到二年之后就不再有官方更新了.

Android 4.0平台交互简析

- Shark - 互联网的那点事
Android4.0继承了3.0的设计多任务、丰富的通知、可定制的主界面、可调整大小的控件、用于交互和分享的互动性元素. 应用程序的结构日趋成熟,几乎没有发生变化,看看系统主要界面是如何体现其设计目标:简洁、美观和更为智能. 从解锁界面可以看出,4.0使用视觉化元素引导用户进行简单直观的手势操作,精致的动画和反馈增加了系统的互动参与感和趣味性,全新的字体提高了高分辨率界面的可读性,显得更为优雅和现代.

DroidVPN-Android平台的VPN应用软件

- - 无名小卒
       DroidVPN是一款在Android平台的VPN应用,可以解除封锁地区的互联网限制和匿名浏览网页,用户可以实现在手机和平板电脑上玩穿越,使用DroidVPN高级服务可能需要付费. 需要注意的是这个程序的apk文件只运行在有root的安卓设备上. 1、给你无限制的速度,但是有流量限制.

Mifare Classic Tool (MCT),Android平台RFID工具

- - FreebuF.COM
最近逛国外坛子的时候发现一新RFID神器,把介绍翻一下. Mifare Classic Tool (MCT) - 一款用来读取/编辑/分析Mifare Classic卡片的安卓软件. 大家好, 这几个月我开发了一款安卓NFC工具, 希望大家用的高兴, 同时希望大家能在github 上一同完善这款工具.

android平台消息推送机制

- - ITeye博客
方案1、使用GCM服务(Google Cloud Messaging). 简介:Google推出的云消息服务,即第二代的G2DM. 优点:Google提供的服务、原生、简单,无需实现和部署服务端. 缺点:Android版本限制(必须大于2.2版本),该服务在国内不够稳定、需要用户绑定Google帐号,受限于Google.

Android平台漏洞挖掘与利用

- - 外刊IT评论
由于Android平台特殊的生态,每一个Android设备中存在着Google、手机开发商、芯片厂商等多种来源的软件. 每个软件模块没有统一的安全审计制度和测试流程,导致质量良莠不齐,对于安全研究者乃至于恶意攻击者来说,一直是一个比较好的目标. 从安全的角度考虑, Android平台利用Linux的uid特性把权限做了很好的区隔,使得在App层级,权限比较受限,一方面阻隔了许多恶意软件可能造成的破坏,另一方面也限缩了用户能够掌控自己设备的能力.