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
分享到:
相关推荐
Android SAX 解析XML SAX 解析XML(通用)
android sax解析xml 完整的例子及说明,解压后就可以运行,相信你的选择
下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。下面的例子可能...
android SAX解析XML
android中用sax解析xml模板的demo源码,解压出来将解析类导入其他工程就可用了不必再写了.
android用sax解析xml文件实例源码
Sax解析xml文件详细例子,解析复杂节点的xml,把内容显示到view中,例子简单完整,易用
android 使用 sax 去解析xml。
android使用SAX解析XML
Android之SAX解析
使用sax解析从网络上获取的xml文件
android sax解析创建xml源码,其中包含两种解析xml的方式。
android 使用sax解析XML,内含视频和源码已经说明文档。非常详细
读取和解析xml文件
Android中SAX解析XML的demo
www.mars-droid.com/Android开发视频教程 代码 源码 mars老师讲课 android 视频源码 SAX解析XML xml 源码(在此特别感谢mars的无私奉献,此代码为跟随视频边学边做的)
android 以SAX方式解析xml
NULL 博文链接:https://z251257144.iteye.com/blog/1356394
android解析XML 文档及源码 大多数与XML 相关的Java API 在Android 上得到了完全支持,在Android 上可以创建功能强大的移动应用程序,而在Android 上解析XML的技术有三种DOM、SAX、PULL。
android 学习笔记1--SAX解析XML,了解下如何用sax解析xml吧