XML解析之SAX解析:
SAX解析器:SAXParser類同DOM一樣也在javax.xml.parsers包下,此類的實例可以從 SAXParserFactory.newSAXParser() 方法獲得。
注意SAXParser的parse()方法:
parse(String uri, DefaultHandler dh),parse(File f, DefaultHandler dh)等都需要傳遞一個DefaultHandler的對象。
查看API幫助手冊可知,SAX解析是事件驅(qū)動的,DefaultHandler是SAX2 事件處理程序的默認基類,在 org.xml.sax.helpers 軟件包中,由它來實現(xiàn)相關(guān)事件的回調(diào),并提供所有回調(diào)方法默認的空實現(xiàn)。
DefaultHandler的常用回調(diào)方法:
void startDocument():接收文檔開始的通知。
void startElement(String uri, String localName, String qName, Attributes attributes): 接收元素開始的通知。
void characters(char[] ch, int start, int length): 接收元素中字符數(shù)據(jù)的通知。
void endElement(String uri, String localName, String qName):接收元素結(jié)束的通知。
void endDocument(): 接收文檔結(jié)束的通知。
為什么說SAX是推模式解析?
SAX 解析器采用了基于事件的模型,它在解析XML文檔的時候可以觸發(fā)一系列的事件,由解析器自動調(diào)用相應事件方法,而不是由我們自己去調(diào)用。
使用SAX解析XML,觀察各種事件回調(diào):
有如下要解析的xml文件:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 3 <students> 4 5 <student id="003"> 6 7 <name>xiaoqiao</name> 8 9 </student>10 11 </students>
解析代碼:
1 public class SaxXmlParser { 2 3 public static void main(String[] args) { 4 5 SAXParserFactory factory = SAXParserFactory.newInstance(); 6 7 try { 8 9 SAXParser parser = factory.newSAXParser();10 11 parser.parse("students_bak.xml", new DefaultHandler(){12 13 @Override14 15 public void characters(char[] ch, int start, int length)16 17 throws SAXException {18 19 System.out.上面代碼在parse()方法中,第二個參數(shù)定義了一個繼承自DefaultHandler的匿名內(nèi)部類對象,重寫了5個主要的事件回調(diào)方法,用以觀察事件的觸發(fā)過程。
在startElement()方法中qName存放的是節(jié)點名,attributes存放的是該節(jié)點的屬性,endElement()方法同樣。
運行結(jié)果:
start document...
start element:<students>
read characters:
start element:<student>
id=003
read characters:
start element:<name>
read characters:xiaoqiao
end element:<name>
read characters:
end element:<student>
read characters:
end element:<students>
end document...
首先回調(diào)的是startDocument()方法;
然后碰到<students>節(jié)點,回調(diào)startElement()方法;
<students>后面有回車,所以會觸發(fā)characters()方法,輸出當前讀到的字符;
然后碰到<student>節(jié)點,回調(diào)startElement()方法,輸出id屬性值;
后面也有回車,所以會觸發(fā)characters()方法,輸出當前讀到的字符;
然后碰到了<name>節(jié)點,回調(diào)startElement()方法;
后面是xiaoqiao,回調(diào)characters()方法;
然后到</name>,回調(diào)endElement()方法;
碰到回車,回調(diào)characters()方法;
到</student>,回調(diào)endElement()方法;
碰到回車,回調(diào)characters()方法;
到</students>,回調(diào)endElement()方法;
文檔結(jié)束,回調(diào)endDocument()方法,解析工作結(jié)束。
如果有需要對文檔進行別的處理操作,如查找某個節(jié)點等,可以重寫響應的事件回調(diào)方法,添加上需要的邏輯的實現(xiàn)代碼即可。
新聞熱點
疑難解答