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;    }@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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的HandlerxmlReader.parse(new InputSource(xml)); //將InputStream裝飾為InputSource,進行解析}private class MySAXHandler extends DefaultHandler {private String currentElement;private Map<String, String> android;@Overridepublic 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>();}}@Overridepublic 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));}}@Overridepublic 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;}}

運行結果:

更多相关文章

  1. Android(安卓)Animation学习(三) ApiDemos解析:XML动画文件的使用
  2. Android(安卓)ConstraintLayout完全解析
  3. andoird拨号流程简单解析
  4. Android(安卓)xml文件 SAX
  5. Android(安卓)共享元素动画,返回时会闪一下的问题
  6. Android中元素按比例布局
  7. java中采用Pull解析器对XML文件进行解析
  8. Android(安卓)-- 使用OKhttp获取response时遇到的坑
  9. Android(安卓)ConstraintLayout 布局解析

随机推荐

  1. Android Activity生命周期 (图文)
  2. 可以显示行号的Android Log 工具
  3. Android(安卓)8.1开启Bluetooth A2DP sin
  4. Android adb LOGCAT显示中文
  5. 视频Android studio1.3.1从菜鸟到高手--
  6. android 动画使用方式
  7. Android中SQLite版本升级
  8. android sd卡读写 附源码
  9. android permission list
  10. Android从一个APP跳转到另一个APP的主界