`
dyingbleed
  • 浏览: 117343 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

【Android】SAX解析XML(20110926更新)

阅读更多

SAX是事件驅動型XML解析接口

優點:解析速度快,內存消耗小

适合Android等移动设备

 

示例:

 

在assets建立用於解析的XML文件source.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<xml><android><version>2.1</version><name>Eclair</name></android><android><version>2.2</version><name>Froyo</name></android><android><version>2.3</version><name>Gingerbread</name></android></xml>

 

 新建一個Activity,我們將在ListView中顯示解析結果

 

package lizhen.sax;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Main extends Activity {
    
	public static final String TAG = "Main";
	private ListView contentListView;
	private List<Map<String, String>> data = new LinkedList<Map<String,String>>();  //結果數據
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        contentListView = (ListView) findViewById(R.id.main_ContentListView);
        try {
        	InputStream xml = getAssets().open("source.xml"); //從assets中讀入數據源
        	MySAXParser parser = new MySAXParser(); 
			parser.parse(xml); //對輸入流進行解析
			data = parser.getResult(); //獲得解析結果
		} catch (ParserConfigurationException e) {
			Log.e(TAG, e.getMessage());
		} catch (SAXException e) {
			Log.e(TAG, e.getMessage());
		} catch (IOException e) {
			Log.e(TAG, e.getMessage());
		}
        contentListView.setAdapter(new ContentListAdapter(this, data));
    }
    
    private class ContentListAdapter extends BaseAdapter {
    	
    	private Context context;
    	private List<Map<String, String>> data;
    	
    	public ContentListAdapter(Context context, List<Map<String, String>> data) {
    		this.context = context;
    		this.data = data;
    	}
		@Override
		public int getCount() {
			return data.size();
		}
		@Override
		public Object getItem(int position) {
			return data.get(position);
		}
		@Override
		public long getItemId(int position) {
			return position;
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View result = convertView;
			if(result == null) {
				result = LayoutInflater.from(context).inflate(R.layout.main_item, null);
			}
			TextView versionTextView = (TextView) result.findViewById(R.id.main_VersionTextView);
			TextView nameTextView = (TextView) result.findViewById(R.id.main_NameTextView);
			versionTextView.setText(data.get(position).get(MySAXParser.ELEMENT_VERSION));
			nameTextView.setText(data.get(position).get(MySAXParser.ELEMENT_NAME));
			return result;
		}
    	
    } 
    
}

 

SAX解析類

通過繼承DefaultHandler,重寫父類方法,對解析XML的過程中觸發的事件進行响应

DefaultHandler常用的囘調方法有:

  • startDocument 文檔開始
  • startElement 元素開始
    uri 命名空间URI
    localName 不带命名空间标签的元素名
    qName 带命名空间的元素名
    attributes 元素属性
  • characters 元素內部字符數據
    ch 字符数组
    start 字符数组开始位置
    length 使用字符数组的长度
  • endElement 元素结束
    uri 命名空间URI
    localName 不带命名空间标签的元素名
    qName 带命名空间的元素名
  • endDocument 文檔結尾

 

package lizhen.sax;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class MySAXParser {
	
	public static final String ELEMENT_ANDROID = "android";
	public static final String ELEMENT_VERSION = "version";
	public static final String ELEMENT_NAME = "name";
	
	private List<Map<String, String>> result = new LinkedList<Map<String,String>>();
	
	public void parse(InputStream xml) throws ParserConfigurationException, SAXException, IOException {
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); //調用靜態方法newInstance得到SAXParseFactory實例
		SAXParser saxParser = saxParserFactory.newSAXParser(); //調用newSAXParser創建SAXParser對象
		XMLReader xmlReader = saxParser.getXMLReader(); //獲得XMLReader對象
		xmlReader.setContentHandler(new MySAXHandler()); //設置處理XML的Handler
		xmlReader.parse(new InputSource(xml)); //將InputStream裝飾為InputSource,進行解析
	}
	
	private class MySAXHandler extends DefaultHandler {
		
		private String currentElement;
		
		private Map<String, String> android;
		
		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			super.startElement(uri, localName, qName, attributes);
			currentElement = localName;
			if(ELEMENT_ANDROID.equals(currentElement)) {
				android = new HashMap<String, String>();
			}
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			super.characters(ch, start, length);
			if(ELEMENT_VERSION.equals(currentElement)){
				android.put(ELEMENT_VERSION, new String(ch, start, length));
			} else if(ELEMENT_NAME.equals(currentElement)) {
				android.put(ELEMENT_NAME, new String(ch, start, length));
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			super.endElement(uri, localName, qName);
			if(ELEMENT_ANDROID.equals(localName)) {
				result.add(android);
			}
		}
		
	}
	
	public List<Map<String, String>> getResult() {
		return this.result;
	}

}
 

 

運行結果:

運行結果

  • 大小: 23 KB
分享到:
评论
1 楼 f839903061 2011-12-11  
能不能用简体字啊?其他的都很好!

相关推荐

    android sax解析xml模板源码下载

    本示例"android sax解析xml模板源码"提供了一个使用SAX解析XML的实例,方便开发者直接导入到自己的项目中使用。 SAX解析XML的基本流程如下: 1. **创建解析器**:在Android中,我们需要使用`SAXParserFactory`来...

    android SAX解析String类型 XML 字符串

    "SAX解析String类型XML字符串"就是一种高效且节省内存的方式去解析XML数据,特别是当XML文件较大时,SAX解析器优于DOM解析器,因为它不需要一次性加载整个XML到内存中。下面我们将深入探讨这一主题。 首先,XML...

    Android SAX 解析XML

    下面详细介绍Android中使用SAX解析XML的关键步骤和相关知识点: 1. 引入库:在Android项目中,SAX解析器已经内置于`org.xml.sax`包中,无需额外导入库。 2. 创建事件处理器:你需要创建一个类来实现`...

    android sax解析xml

    本篇将详细讲解如何在Android环境中使用SAX解析XML。 1. **SAX解析的基本原理** SAX解析器读取XML文档时,遇到每个元素、属性、文本等都会触发相应的事件,开发者需要注册事件处理器来处理这些事件。这种方式适合...

    android 使用Sax解析XML 源码实例

    下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。下面的例子可能...

    android使用SAX解析xml

    - `xmlSAXPaserDemo`可能是一个包含示例代码的Android项目,用于演示如何实际使用SAX解析XML文件。 - 项目中可能包括网络请求模块、SAX解析器处理类以及展示解析结果的UI部分。 通过以上步骤,开发者可以在...

    [Android]使用SAX解析XML文件

    总结,SAX解析XML在Android开发中是一个实用且高效的解决方案,尤其适用于处理大型XML文件。通过创建自定义的事件处理器,可以灵活地解析和处理XML数据,满足各种业务需求。不过,需要注意的是,由于SAX是基于事件的...

    Sax解析xml文件

    以下是一个使用SAX解析XML文件的基本步骤: 1. **创建解析器**: 首先,我们需要创建一个SAX解析器实例。在Java中,这通常通过`SAXParserFactory`类完成。设置解析器属性,然后调用`newSAXParser()`方法获取`...

    android sax 解析xml

    本文将详细介绍如何在Android中使用SAX解析XML。 首先,理解SAX解析的基本原理。SAX解析器在读取XML文档时,会触发一系列的事件,例如开始文档、结束文档、开始元素、结束元素等。开发者需要创建一个实现了`...

    android sax解析xml文件

    以下是一个简单的SAX解析XML文件的Android实例源码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxExample extends ...

    Android之SAX解析XML

    SAX解析器为Android开发者提供了一种高效且内存友好的方式来解析XML数据,尤其适用于处理大量或复杂的数据。在`SaxTest`项目中,你可以找到一个具体的示例,演示如何将这些概念整合到实际的Android应用中。

    Android SAX、DOM、Pull解析xml文件案例讲解

    以下是使用SAX解析XML的基本步骤: - 创建`DefaultHandler`子类,重写关键方法如`startElement`、`endElement`和`characters`。 - 实例化`SAXParserFactory`,然后获取`SAXParser`。 - 使用`parse`方法解析XML文件...

    android SAX解析XML.docx

    在Android中使用SAX解析XML,主要涉及以下几个关键步骤: 1. **创建ContentHandler**:ContentHandler是SAX解析的核心,它定义了一系列的回调方法,用于处理XML文档的各种事件。比如`startDocument()`会在解析开始...

    android使用SAX解析XML

    下面我们将详细讨论如何在Android中使用SAX解析XML。 首先,我们需要了解SAX解析的基本原理。SAX解析器在读取XML文档时,会触发一系列的事件,如开始文档、开始元素、结束元素、字符数据等。开发者需要定义一个...

    Android XML解析——Sax解析XML

    ### Android中使用SAX解析XML 1. **引入库**:在Android项目中,SAX解析器已经内置在`org.xml.sax`包中,无需额外导入库。 2. **创建ContentHandler**:创建一个实现了`org.xml.sax.ContentHandler`接口的类,重写...

    android 使用sax解析XML

    本教程将详细讲解如何在Android中使用SAX解析XML。 首先,要使用SAX解析XML,我们需要理解其工作原理。SAX解析器会逐个读取XML文档的元素,每当遇到文档的开始、结束、文本等事件时,就会触发相应的回调方法。...

    android sax解析创建xml源码

    本篇文章将深入探讨Android环境下如何使用SAX解析XML,并介绍两种不同的解析方式。 ### SAX解析的基本原理 SAX解析器以流式方式读取XML文档,当遇到XML文档的各个元素时,会触发相应的事件回调,例如开始文档、...

    android下解析xml文件的demo

    本教程将详细介绍如何在Android环境下解析XML文件,以"ReadXMLDemo"为例,展示具体步骤和关键知识点。 首先,XML(eXtensible Markup Language)是一种自定义标记语言,它的结构清晰,易于读写,适合于数据交换和...

    android 三种方式解析XML(DOM,Pull,Sax) 带文件编码识别

    本篇文章将深入探讨三种在Android中解析XML的方法:DOM(文档对象模型)、Pull(拉取解析器)和SAX(简单API for XML),并且会特别强调如何识别文件编码。 首先,DOM解析是将整个XML文件加载到内存中形成一个树形...

    SAX解析xml文件源码

    下面将详细介绍SAX解析XML文件的基本原理、工作流程以及在Android环境下如何实现。 **SAX解析的基本原理:** SAX解析器在读取XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素、字符数据等...

Global site tag (gtag.js) - Google Analytics