Android学习之XML数据的三种解析方式以及生成XML文件
2015-07-10 10:42
721 查看
首先,我得声明,本博客的思想主要参考了此博客:http://blog.csdn.net/liuhe688/article/details/6415593
不过代码我自己一句句敲的
好了,首先讲一下解析XML的三种方式:(恕我粘贴一下哈)
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
好了,介绍完三种解析方式,现在开始进行xml文件的解析与生成了。
首先需要在项目的assets目录里面放置一个xml文件来给我们此次做xml源文件,当然,实际应用当中,可以通过httpClient 或者URLConnection的方式进行获取服务器的xml文件来与服务器进行交互,这里我就直接放到项目里面了,方便操作一些,以下是我的xml文件,比较简单,实践的时候,可以自己随意想一种格式的xml文件:
View Code
生成XML文件的格式(直接通过XmlSeriaizer实例对象serializer进行生成格式):
serializer.startDocument();
serializer.startTag();
serializer.startTag();
serializer.endTag();
serializer.endTag();
serializer.endDocument();
设置值的时候,使用:serializer.Text();
对于这三种解析器各有优点,其中PULL解析器方便快捷,因为SAX解析器操作起来太笨重,DOM不适合文档较大,内存较小的场景,唯有PULL轻巧灵活,速度快,占用内存小,使用非常顺手。各位按自己的爱好来选择吧
不过代码我自己一句句敲的
好了,首先讲一下解析XML的三种方式:(恕我粘贴一下哈)
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
好了,介绍完三种解析方式,现在开始进行xml文件的解析与生成了。
首先需要在项目的assets目录里面放置一个xml文件来给我们此次做xml源文件,当然,实际应用当中,可以通过httpClient 或者URLConnection的方式进行获取服务器的xml文件来与服务器进行交互,这里我就直接放到项目里面了,方便操作一些,以下是我的xml文件,比较简单,实践的时候,可以自己随意想一种格式的xml文件:
package com.oysd.ouyangxml.parser; import java.io.InputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import android.util.Log; import android.util.Xml; import com.oysd.ouyangxml.model.Address; public class PullAddressParser implements AddressParser{ private static final String TAG = "PullAddressParser"; @Override public List<Address> parser(InputStream is) throws Exception { List<Address> addresses = null; Address address = null; //由android.util.Xml创建一个XmlPullParser实例 XmlPullParser parser = Xml.newPullParser(); //设置输入流 并指明编码方式 parser.setInput(is, "utf-8"); int eventType = parser.getEventType(); while(eventType != XmlPullParser.END_DOCUMENT){ String str = parser.getName(); switch(eventType){ case XmlPullParser.START_DOCUMENT: addresses = new ArrayList<Address>(); break; case XmlPullParser.START_TAG: if(parser.getName().equals("address")){ address = new Address(); }else if(parser.getName().equals("id")){ //Log.d(TAG, parser.getText()); eventType = parser.next(); //Log.d(TAG, parser.getText()); address.setId(Integer.parseInt(parser.getText())); }else if(parser.getName().equals("name")){ //Log.d(TAG, parser.getText()); eventType = parser.next(); //Log.d(TAG, parser.getText()); address.setName(parser.getText()); }else if(parser.getName().equals("money")){ //Log.d(TAG, parser.getText()); eventType = parser.next(); //Log.d(TAG, parser.getText()); address.setMoney(Float.parseFloat(parser.getText())); } break; case XmlPullParser.END_TAG: if(parser.getName().equals("address")){ addresses.add(address); address = null; } break; } //Log.d(TAG, parser.getText()); eventType = parser.next(); //Log.d(TAG, parser.getText()); } return addresses; } @Override public String outPutXml(List<Address> addresses) throws Exception { XmlSerializer serializer = Xml.newSerializer();//由android.util.Xml创建一个XmlSerializer实例 StringWriter writer = new StringWriter(); serializer.setOutput(writer);//设置输出方向为writer serializer.startDocument("utf-8", true); serializer.startTag("", "addresses"); for(Address address : addresses){ serializer.startTag("", "book"); serializer.attribute("", "id", address.getId() + ""); serializer.startTag("", "name"); serializer.text(address.getName()); serializer.endTag("", "name"); serializer.startTag("", "moeny"); serializer.text(address.getMoney() + ""); serializer.endTag("", "money"); serializer.endTag("", "address"); } serializer.endTag("", "addresses"); serializer.endDocument(); return writer.toString(); } }
View Code
生成XML文件的格式(直接通过XmlSeriaizer实例对象serializer进行生成格式):
serializer.startDocument();
serializer.startTag();
serializer.startTag();
serializer.endTag();
serializer.endTag();
serializer.endDocument();
设置值的时候,使用:serializer.Text();
对于这三种解析器各有优点,其中PULL解析器方便快捷,因为SAX解析器操作起来太笨重,DOM不适合文档较大,内存较小的场景,唯有PULL轻巧灵活,速度快,占用内存小,使用非常顺手。各位按自己的爱好来选择吧
相关文章推荐
- Android反编译(操作简单、方便可用)
- android程序点返回键无反应
- Android USB Host与HID通讯
- 加速Android Studio/Gradle构建
- 转载:Android 如何解决dialog弹出时无法捕捉Activity的back事件
- Android Robtium ActivityUtils
- Android 学习汇总
- android 启动程序软键盘不自动弹出
- Android 自定义Dialog,以及失去焦点之后,Dialog消失的解决
- Android图形用户界面开发之ViewTree和DecorView详细介绍
- 关于android Activity中注解的使用,省去无用的findviewbyid....setonclick.....
- android 背光调节
- android 设置LinearLayout,RelativeLayout等等layout的高和宽
- androidgpio操作
- android下拉刷新
- android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化
- Android应用启动过程浅析
- Xamarin For Android 打包编译APK文件详细图文教程
- 初学android 记录自己的每日所学
- android-使用环信SDK开发即时通信功能及源码下载