Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之SAX解析XML

Android之SAX解析XML

編輯:關於Android編程

首先我們來了解一下SAX解析器的基本知識:

SAX(Simple API for XML)解析器是一種基於事件的解析器,事件驅動的流式解析方式是,從文件的開始順序解析到文檔的結束,不可暫停或倒退。它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產生事件後,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器才能夠根據提供的事件信息來決定自己的行為。

SAX的工作原理:簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。

然後我們通過一個小例子來看一下android中我們如何運用SAX去解析XML文件:

(1)首先我們拷貝一個beauties.xml文件到assets目錄下,其內容如下:

  
  
      
        范冰冰  
        28  
      
      
        楊冪  
        23  
      
  
  

(2) 然後在layout下面新建一個布局文件saxtest.xml,其內容如下:




    


(3)在src目錄下新建一個與xml裡面的節點對應的一個類Beauty,內容如下:

package com.saxtest;

public class Beauty {

	private String name;
	private String age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "美女資料 [年齡=" + age + ", 姓名=" + name + "]";
	}
}

再寫一個關鍵的類MySaxHandler,在這個類中我們將解析出來的字符串生成了Beauty對象,並加入到List中,代碼已經詳細注釋,內容如下:

package com.saxtest;

import java.util.ArrayList;

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

public class MySaxHandler extends DefaultHandler{
	
	//聲明一個裝載Beauty類型的List
	private ArrayList mList;
	//聲明一個Beauty類型的變量
	private Beauty beauty;
	//聲明一個字符串變量
	private String content;
	
	/**
	 * MySaxHandler的構造方法
	 * 
	 * @param list 裝載返回結果的List對象
	 */
	public MySaxHandler(ArrayList list){
		this.mList = list;
	}
	
	/**
	 * 當SAX解析器解析到XML文檔開始時,會調用的方法
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();	
	}
	
	/**
	 * 當SAX解析器解析到XML文檔結束時,會調用的方法
	 */
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
	}
	
	/**
	 * 當SAX解析器解析到某個屬性值時,會調用的方法
	 * 其中參數ch記錄了這個屬性值的內容
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		content = new String(ch, start, length);
	}
	
	/**
	 * 當SAX解析器解析到某個元素開始時,會調用的方法
	 * 其中localName記錄的是元素屬性名
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);

		if("beauty".equals(localName)){
			beauty = new Beauty(); //新建Beauty對象
		}
	}
	
	/**
	 * 當SAX解析器解析到某個元素結束時,會調用的方法
	 * 其中localName記錄的是元素屬性名
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
		
		if("name".equals(localName)){
			beauty.setName(content);
		}else if("age".equals(localName)){
			beauty.setAge(content);
		}else if("beauty".equals(localName)){
			mList.add(beauty); //將Beauty對象加入到List中
		}
	}
}

第三個源文件就是SaxTestActivity,這個Activity的布局文件saxtest.xml,之前已經給出過它的內容,現在我們貼出Activity源碼的內容,代碼都已經詳細注釋了:

package com.saxtest;

import java.io.InputStream;
import java.util.ArrayList;

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

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.widget.TextView;

import com.example.saxtest.R;

public class SaxTestActivity extends Activity{
	
	//聲明裝載Beauty對象的List
	private ArrayList beautyList;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.saxtest);
		
		//初始化beautyList鏈表
		if(beautyList == null){
			beautyList = new ArrayList();
		}
		
		doMyMission();
		
		setupViews();
	}
	
	/**
	 * 使用SAX解析器解析XML文件的方法
	 */
	private void doMyMission(){
		try {
			//獲取AssetManager管理器對象
			AssetManager as = this.getAssets();
			//通過AssetManager的open方法獲取到beauties.xml文件的輸入流
			InputStream is = as.open("beauties.xml");
			//通過獲取到的InputStream來得到InputSource實例
			InputSource is2 = new InputSource(is);
			//使用工廠方法初始化SAXParserFactory變量spf
			SAXParserFactory spf = SAXParserFactory.newInstance();
			//通過SAXParserFactory得到SAXParser的實例
			SAXParser sp = spf.newSAXParser();
			//通過SAXParser得到XMLReader的實例
			XMLReader xr = sp.getXMLReader();
			//初始化自定義的類MySaxHandler的變量msh,將beautyList傳遞給它,以便裝載數據
			MySaxHandler msh = new MySaxHandler(beautyList);
			//將對象msh傳遞給xr
			xr.setContentHandler(msh);
			//調用xr的parse方法解析輸入流
			xr.parse(is2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 將解析結果輸出到界面的方法
	 */
	private void setupViews(){
		String result = "";
		
		for (Beauty b : beautyList) {  
            result += b.toString();  
        }  

        TextView textView = (TextView) findViewById(R.id.textView);  
        textView.setText(result); 
	}

}

右鍵運行工程代碼,結果截圖如下:

n塊ズ楗╧yAndroid之SAX解析XML


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved