Android] Android XML解析学习——方式比较
分类: 嵌入式
(From:http://blog.csdn.net/ichliebephone/article/details/5981913)
一.基础知识
经过这段时间的学习,我们已经了解了Android平台上用于解析XML的三种方式:SAX、DOM和Pull。并且在学习的过程中也介绍了这三种方式各自的特点及适合的使用场合,简单的来说,DOM方式最直观和容易理解,但是只适合XML文档较小的时候使用,而SAX方式更适合在Android系统中使用,因为相比DOM占用内存少,适合处理比较大的XML文档,最后的Pull方式使用场合和SAX类似,但是更适合需要提前结束XML文档解析的场合。
在这部分的学习中,我们将对以上三种方式解析XML的性能进行一下简单的比较,通过记录比较他们读取相同XML文档的时间来更好的理解他们的性能,从而使你在不同的场合更好的选择使用那一种XML的解析方式。
下面我们就用上面介绍的几种方式来实现解析XML形式的USGS地震数据的Demo例子以作比较。
二.实例开发
我们要完成的效果图如下图1所示:
图1 各种方式解析花费的时间比较
我们分别使用Java SAX,Android SAX,DOM和Pull方式解析相同的XML地震数据,并记录他们完成解析所花费的时间,结果如上图所示。
新建一个Android工程AndroidXMLDemoCompare。
添加进之前Demo工程AndroidXMLDemoSax中的EarthquakeEntry.java和SaxEarthquakeHandler.java文件,工程AndroidXMLDemoSaxII中的AndroidSaxEarthquakeHandler.java文件,工程AndroidXMLDemoDom中的DomEarthquakeHandler.java文件,和工程AndroidXMLDemoPull中的PullEarthquakeHandler.java文件。
如果需要从本地读取xml数据的话,同时在assets文件夹下添加保存为xml格式了的USGS地震数据USGS_Earthquake_1M2_5.xml和USGS_Earthquake_7M2_5.xml,如果需要联网读取的话,在manifest.xml文件中添加权限:
- <uses-permission android:name="android.permission.INTERNET" />
并修改res/layout下的main.xml为:
- xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button
- android:id="@+id/javaSaxBtn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Java SAX Parse"
- >
- Button>
- <Button
- android:id="@+id/androidSaxBtn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Android SAX Parse"
- >
- Button>
- <Button
- android:id="@+id/domBtn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="DOM Parse"
- >
- Button>
- <Button
- android:id="@+id/pullBtn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="PULL Parse"
- >
- Button>
- <TextView
- android:id="@+id/javaSaxText"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Java SAX Parse Time:">
- TextView>
- <TextView
- android:id="@+id/androidSaxText"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Android SAX Parse Time:">
- TextView>
- <TextView
- android:id="@+id/domText"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="DOM Parse Time:">
- TextView>
- <TextView
- android:id="@+id/pullText"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="PULL Parse Time:">
- TextView>
- LinearLayout>
主要定义了4个分别启动Java SAX、Android SAX、DOM和Pull方式解析的按钮Button,和4个显示解析所花费时间的TextView。
接着修改AndroidXMLDemoCompare.java文件的内容为:
- public class AndroidXMLDemoCompare extends Activity {
- /** Called when the activity is first created. */
- //定义变量
- Button javaSaxBtn, androidSaxBtn, domBtn, pullBtn;
- TextView javaSaxText, androidSaxText, domText, pullText;
- ArrayList earthquakeEntryList;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //测试各个xml解析方法的速度
- javaSaxBtn = (Button)findViewById(R.id.javaSaxBtn);
- androidSaxBtn = (Button)findViewById(R.id.androidSaxBtn);
- domBtn = (Button)findViewById(R.id.domBtn);
- pullBtn = (Button)findViewById(R.id.pullBtn);
- javaSaxText = (TextView)findViewById(R.id.javaSaxText);
- androidSaxText = (TextView)findViewById(R.id.androidSaxText);
- domText = (TextView)findViewById(R.id.domText);
- pullText = (TextView)findViewById(R.id.pullText);
- javaSaxBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- javaSaxBtn.setEnabled(false);
- androidSaxBtn.setEnabled(false);
- domBtn.setEnabled(false);
- pullBtn.setEnabled(false);
- //获取地震数据流
- InputStream earthquakeStream = readEarthquakeDataFromFile();
- String saxTime = "Java SAX Parse Time: 正在解析,请稍后...";
- javaSaxText.setText(saxTime);
- long beforeTime = System.currentTimeMillis();
- //Java Sax方式进行xml解析
- SAXParserFactory factory = SAXParserFactory.newInstance();
- try {
- SAXParser parser = factory.newSAXParser();
- SaxEarthquakeHandler saxHandler = new SaxEarthquakeHandler();
- parser.parse(earthquakeStream, saxHandler);
- //获取解析后的列表数据
- earthquakeEntryList = saxHandler.getEarthquakeEntryList();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //解析完毕
- long afterTime = System.currentTimeMillis();
- long parseTime = (afterTime - beforeTime);
- saxTime = "Java SAX Parse Time: " + String.valueOf(parseTime) + "毫秒";
- javaSaxText.setText(saxTime);
- javaSaxBtn.setEnabled(true);
- androidSaxBtn.setEnabled(true);
- domBtn.setEnabled(true);
- pullBtn.setEnabled(true);
- }
- });
- androidSaxBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- javaSaxBtn.setEnabled(false);
- androidSaxBtn.setEnabled(false);
- domBtn.setEnabled(false);
- pullBtn.setEnabled(false);
- //获取地震数据流
- InputStream earthquakeStream = readEarthquakeDataFromFile();
- String saxTime = "Android SAX Parse Time: 正在解析,请稍后...";
- androidSaxText.setText(saxTime);
- long beforeTime = System.currentTimeMillis();
- //Android Sax方式进行解析
- AndroidSaxEarthquakeHandler androidSaxHandler = new AndroidSaxEarthquakeHandler();
- earthquakeEntryList = androidSaxHandler.parse(earthquakeStream);
- //解析完毕
- long afterTime = System.currentTimeMillis();
- long parseTime = (afterTime - beforeTime);
- saxTime = "Android SAX Parse Time: " + String.valueOf(parseTime) + "毫秒";
- androidSaxText.setText(saxTime);
- javaSaxBtn.setEnabled(true);
- androidSaxBtn.setEnabled(true);
- domBtn.setEnabled(true);
- pullBtn.setEnabled(true);
- }
- });
- domBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- javaSaxBtn.setEnabled(false);
- androidSaxBtn.setEnabled(false);
- domBtn.setEnabled(false);
- pullBtn.setEnabled(false);
- //获取地震数据流
- InputStream earthquakeStream = readEarthquakeDataFromFile();
- String domTime = "DOM Parse Time: 正在解析,请稍后...";
- domText.setText(domTime);
- long beforeTime = System.currentTimeMillis();
- //Dom方式进行xml解析
- DomEarthquakeHandler domHandler = new DomEarthquakeHandler();
- earthquakeEntryList = domHandler.parse(earthquakeStream);
- //解析完毕
- long afterTime = System.currentTimeMillis();
- long parseTime = (afterTime - beforeTime);
- domTime = "DOM Parse Time: " + String.valueOf(parseTime) + "毫秒";
- domText.setText(domTime);
- javaSaxBtn.setEnabled(true);
- androidSaxBtn.setEnabled(true);
- domBtn.setEnabled(true);
- pullBtn.setEnabled(true);
- }
- });
- pullBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- javaSaxBtn.setEnabled(false);
- androidSaxBtn.setEnabled(false);
- domBtn.setEnabled(false);
- pullBtn.setEnabled(false);
- //获取地震数据流
- InputStream earthquakeStream = readEarthquakeDataFromFile();
- String pullTime = "PULL Parse Time: 正在解析,请稍后...";
- pullText.setText(pullTime);
- long beforeTime = System.currentTimeMillis();
- //Pull方式进行xml解析
- PullEarthquakeHandler pullHandler = new PullEarthquakeHandler();
- earthquakeEntryList = pullHandler.parse(earthquakeStream);
- //解析完毕
- long afterTime = System.currentTimeMillis();
- long parseTime = (afterTime - beforeTime);
- pullTime = "PULL Parse Time: " + String.valueOf(parseTime) + "毫秒";
- pullText.setText(pullTime);
- javaSaxBtn.setEnabled(true);
- androidSaxBtn.setEnabled(true);
- domBtn.setEnabled(true);
- pullBtn.setEnabled(true);
- }
- });
- }
- private InputStream readEarthquakeDataFromFile()
- {
- //从本地获取地震数据
- InputStream inStream = null;
- try {
- //1天内2.5级以上的地震数据,约20来条地震信息
- // inStream = this.getAssets().open("USGS_Earthquake_1M2_5.xml");
- //7天内2.5级以上的地震数据,约200来条地震信息
- inStream = this.getAssets().open("USGS_Earthquake_7M2_5.xml");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return inStream;
- }
- private InputStream readEarthquakeDataFromInternet()
- {
- //从网络上获取实时地震数据
- URL infoUrl = null;
- InputStream inStream = null;
- try {
- //1天内2.5级以上的地震数据,约20来条地震信息
- infoUrl = new URL("http://earthquake.usgs.gov/earthquakes/catalogs/1day-M2.5.xml");
- //7天内2.5级以上的地震数据,约200来条地震信息
- // infoUrl = new URL("http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml");
- URLConnection connection = infoUrl.openConnection();
- HttpURLConnection httpConnection = (HttpURLConnection)connection;
- int responseCode = httpConnection.getResponseCode();
- if(responseCode == HttpURLConnection.HTTP_OK)
- {
- inStream = httpConnection.getInputStream();
- }
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return inStream;
- }
- }
首先也是定义各个Button和TextView控件,接着为各个Button注册单击事件处理器,在单击事件处理的回调函数中,主要就是运行对应XML解析方式的解析过程,并且分别记录解析前和解析后的系统时间来计算解析所花费的时间,
- long beforeTime = System.currentTimeMillis();
- //Android Sax方式进行解析
- AndroidSaxEarthquakeHandler androidSaxHandler = new AndroidSaxEarthquakeHandler();
- earthquakeEntryList = androidSaxHandler.parse(earthquakeStream);
- //解析完毕
- long afterTime = System.currentTimeMillis();
- long parseTime = (afterTime - beforeTime);
完成了,可以保存运行看下效果。
图2 解析时间比较
左图是解析1天内2.5级以上的地震数据,约20来条地震信息时各个解析方式所花费的时间,右图是解析7天内2.5级以上的地震数据,约180来条地震信息时各个解析方式所花费的时间。从上图我们可以看到Java SAX、Android SAX和Pull方式花费的时间基本差不多,因为他们都是基于事件处理的方式,并且Java SAX和Android SAX底层调用的都是相同的org.xml.sax包中XMLReader解析器。而DOM方式相对来说所花费的时间就会长点,在地震数据条数较少和较多时都比较长。因此不管是从内存的消耗角度或者解析使用的时间角度来考虑,在Android平台上的应用程序中都不太推荐使用DOM方式来解析XML数据。但是Java SAX、Android SAX和Pull就看你喜欢使用哪个和你具体的使用场合了,性能上他们基本相同。
三.总结
在这部分内容中我们学习了各个解析方式的性能比较,即解析同一个XML文档时所花费时间的比较,并且从结果可以看出DOM方式的性能相对来说差点,而Java SAX、Android SAX和Pull方式的性能基本相同。
这样我们就比较全面的学习了Android平台上对XML文档进行解析的各种方式,但目前我们只是使用现成的XML文档来解析,实际上在使用过程中我们可能还会需要构造XML文档,比如可能会有需要向服务器发送XML,或者把一份数据以XML的形式保存在本地,这块内容就是写XML,我们以后接着学习。
Android] Android XML解析学习——方式比较的更多相关文章
- Android实现XML解析技术
转载:Android实现XML解析技术 本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为 ...
- Android中XML解析,保存的三种方法
简单介绍 在Android开发中,关于XML解析有三种方式,各自是: SAX 基于事件的解析器.解析速度快.占用内存少.非常适合在Android移动设备中使用. DOM 在内存中以树形结构存放,因此检 ...
- Android项目--XML解析
对于xml文件,一般有两种解析方式: -----pull解析-------- -----Sax解析------- 如果xml文件是本地文件,那么就好说了 AssetManager assetManag ...
- Android 简易XML解析
首先创建在Android工程中创建一个Assets文件夹 app/src/main/assets 在这里添加一个名为 data.xml的文件,然后编辑这个文件,加入如下XML格式内容 <?xml ...
- Android中XML解析
package com.example.thebroadproject; public class Book { private int id; private String name; privat ...
- Android 之xml解析
HTTP网络传输中的数据组织方式有三种方式:1.HTML方式2.XML方式 3.JSON方式 XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言) XML是Internet环境 ...
- Android,XML解析
XML解析三种方式 DOM 通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树.检索所需的数据: 简单直观,但需要将文档读取到内存,并不太适合移动设备: SAX ...
- Android中XML解析-Dom解析
Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...
- Android中XML解析-SAX解析
昨天由于时间比较匆忙只写了Android中的XML解析的Dom方式,这种方式比较方便,很容易理解,最大的不足就是内容多的时候,会消耗内存.SAX(Simple API for XML)是一个解析速度快 ...
随机推荐
- iosiOStextView实现文字高度自适应
跟为textView设置提示性文字一样 需要在textView的代理方法中实现如下 如有偏差 请谅解 定义UITextView,实现UITextViewDelegate: -(UITextVie ...
- java 多线程 一个博客
http://blog.csdn.net/a352193394/article/category/2563875 Java多线程之~~~线程安全容器的非阻塞容器 在并发编程中,会经常遇到使用容器.但是 ...
- Output Limit Exceed是什么情况引起的
输入的格式错误 Output Limit Exceed是超过输出限制(OLE)错误,提示你的程序产生了过多的输出信息,一般是由于死循环造成的.你的程序发生上述错误的主要原因是循环语句while(sca ...
- C# WebBrowser函数互相调用
在使用C#开发winform程序过程中,我们经常会碰到嵌入了一个WebBrowser的浏览器控件.很多时候,我们需要在程序里控制网页的显示方式,或者调用网页当中的某个JS函数,反过来,也有可能网页也需 ...
- 购物车(Shopping cart) —— B2C网站核心产品设计 (二)
购物车是做什么的? 我们先来看一下现实超市中的购物车,一个带四个轱辘的铁筐子,客人推来推去,看到什么东西喜欢,就扔进去,觉得东西差不多了,就推到收银台. 那B2C网站中的购物车又是一个什么东西呢? 从 ...
- Go-file
两个包具有文件操作的相关方法,一个是os,一个是syscall,其中os中的相关方法是对syscall相关方法的封装,推荐使用os中的相关方法.文件的打开文件的第一步操作实际上是创建,但是由于文件的打 ...
- dip2px
package com.itheima.zhbj.utils; import android.content.Context; public class DensityUtils { public s ...
- AJAX 在手机上用时
Response.ContentType = "text/html; text/plain; charset=UTF-8";
- .project
http://blog.csdn.net/qiushuichangtian888/article/details/9299843 一个老项目导入新环境后老是提示build.properties不存在的 ...
- PHP基本类型操作
//关键字对大小写不敏感echo ('hello world!<br>');ECho ('hello world<br>');eCho ('hello world<br& ...