編輯:關於Android編程
首先我們來了解一下SAX解析器的基本知識:
SAX(Simple API for XML)解析器是一種基於事件的解析器,事件驅動的流式解析方式是,從文件的開始順序解析到文檔的結束,不可暫停或倒退。它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產生事件後,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器才能夠根據提供的事件信息來決定自己的行為。
SAX的工作原理:簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。
然後我們通過一個小例子來看一下android中我們如何運用SAX去解析XML文件:
(1)首先我們拷貝一個beauties.xml文件到assets目錄下,其內容如下:
范冰冰 28楊冪 23
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 + "]";
}
}
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中
}
}
}
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);
}
}
Android之SAX解析XML
安卓--異步處理工具類(AsyncTask)
.xml代碼如下: .java代碼如下: package org.lxh.demo; import android.app.
Android 5.0以上Toast不顯示的解決方法
原因分析用戶使用android 5.0以上的系統在安裝APP時,將消息通知的權限關閉掉了。實際上用戶本意只是想關閉Notification,但是Toast的show方法中
Android實現滑動到頂部懸停的效果
先來看下要實現效果圖:查閱資料後,發現網上大部分都是用這種方法實現的:多寫一個和需要懸浮的部分一模一樣的layout,先把浮動區域的可見性設置為gone。當浮動區域滑動到
Android內存洩露測試
在進行Android內存洩露分析時,面對成千上萬個對象,你是否藍瘦,香菇?作為測試人員你在進行內存洩露測試之後,是否有勇氣告訴開發同事程序已經沒有內存洩露,可以放心發布了