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();
}
}
}