SAX解析XML

SAX

事件處理(事件驅動),不需要載入整個文檔,流機制讀取,分析XML文檔

startDocument

startElement

character

endElement

endDocument

sax掃描到文檔時就調用startDocument函數,sax掃描到文檔結束符時就調用endDocument函數,也就是說當sax掃描到哪個節點時就會調用相應的函數,同時還會攜帶節點的屬性值。

當它掃描到節點內容值時就會調用character函數

Sax主要是用來對xml文件遍歷,解析,不提供修改、刪除、添加等操作,可以處理大的文檔查詢的操作。


SAX    當解析器發現元素開始、元素結束,文本、文檔的開始或者結束時,發送 事件,在程序中編寫響應這些事件的代碼,其特點如下:

優點:不用事先調入整個文檔,佔用資源少。尤其在嵌入式環境中,極力推薦採用SAX進行解析XML文檔。

缺點:不像DOM一樣將文檔長期駐留在內存,數據不是持久的,事件過後,如沒有保存數據,那麼數據就會丟失。

使用場合:機器性能有限,尤其是在嵌入式環境,如Android,極力推薦採用SAX進行解析XML文檔。


package com.huang;

import java.util.ArrayList;
import java.util.List;

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

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

/**
 * SAX解析XML文檔
 * @author Admin
 *
 */
class MyHandler extends DefaultHandler{
	//掃描文本開始
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
	}
	//掃描到元素
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {          //qName表示節點名稱,attributes表示節點屬性值
		super.startElement(uri, localName, qName, attributes);
		System.out.println(qName);        //輸出每個節點名稱
		String s = attributes.getValue("學生稱號");
		if (s != null) {
			System.out.println("學生稱號:" + s);
		}

	}
	//掃描到文本時,元素值時(包括空的,如root,student等)
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		String str = new String(ch, start, length);
		if(!str.trim().equals("")){       //xml文檔中有很多節點的值是空的,如student
			System.out.println("內容:"+str);
		}
		
	}
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
	}
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
	}

	
	
}
public class Sax {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SAXParserFactory saxpf = SAXParserFactory.newInstance();
		SAXParser saxp;
		try {
			saxp = saxpf.newSAXParser();
			//將掃描儀與事件處理綁定
			saxp.parse("./src/data.xml", new MyHandler());
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		
	
	}
}


發佈了102 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章