国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

java拾遺2----XML解析(二) SAX解析

2019-11-15 00:49:06
字體:
供稿:網(wǎng)友
java拾遺2----xml解析(二) SAX解析

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)代碼即可。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉山县| 黄梅县| 榕江县| 南皮县| 九江市| 和田县| 西乌珠穆沁旗| 崇阳县| 西乡县| 洞口县| 满城县| 儋州市| 资阳市| 申扎县| 清远市| 闽清县| 贵溪市| 邓州市| 常熟市| 喀什市| 绍兴市| 洛南县| 长岭县| 梁平县| 庄河市| 丹东市| 平邑县| 克什克腾旗| 台东县| 东宁县| 莲花县| 北票市| 略阳县| 宁德市| 延吉市| 托克托县| 天津市| 鹰潭市| 安义县| 丹阳市| 龙山县|