溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

XML編程中SAX的示例分析

發(fā)布時間:2021-09-17 14:50:21 來源:億速云 閱讀:168 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“XML編程中SAX的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“XML編程中SAX的示例分析”這篇文章吧。

XML編程-SAX

基本概述

SAX,全稱Simple API for XML,既是一種接口,也是一種軟件包。它是一種XML解析的替代方法。SAX不同于DOM解析,它逐行掃描文檔,一邊掃描一邊解析。由于應(yīng)用程序只是在讀取數(shù)據(jù)時檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲在內(nèi)存中,這對于大型文檔的解析是個巨大優(yōu)勢。

SAX是一個用于處理XML事件驅(qū)動的“推”模型,雖然它不是W3C標準,但它卻是一個得到了廣泛認可的API。SAX解析器不像DOM那樣建立一個完整的文檔樹,而是在讀取文檔時激活一系列事件,這些事件被推給事件處理器,然后由事件處理器提供對文檔內(nèi)容的訪問。

PS:SAX不能夠?qū)ML文件進行修改,刪除、添加操作。

為什么引入SAX技術(shù)?

DOM技術(shù)也是一種非常好的DOM解析方案,為什么還會出現(xiàn)SAX技術(shù)呢?原因很簡單,那就是DOM是以文檔樹的結(jié)構(gòu)對XML進行保存,這就表明是一次性將XML讀入內(nèi)存,那么這在大型的XML文件中是不可能的。所以才產(chǎn)生了SAX這種掃描解析的技術(shù)。

原理圖

XML編程中SAX的示例分析

SAX解析機制

SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完才會文檔進行操作。

在Java中,通過繼承DefaultHandler 接口,可以開發(fā)一個SAX解析器。

SAX的解析機制和事件監(jiān)聽機制很像,都是等待某一事件觸發(fā),然后調(diào)用相應(yīng)方法。

SAX解析器的最常用5個事件:

1、startDocument():這標識著SAX解析器掃描到文檔開始位置。

2、endDocument(),這標識著SAX解析器掃描到文檔的結(jié)束位置。

3、startElement(),這標識著SAX解析器掃描到一個元素的開始標簽。

4、character(),這標識著SAX解析器掃描到了一些文本,注意它是以char數(shù)組形式存放的。

5、endElement(),這標識著SAX解析器掃描到了一個元素的結(jié)束標簽。

事件處理器常用方法參數(shù)列表

public void startDocument()

public void startElement(String uri, String localName, String qName,Attributes attributes)

uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執(zhí)行名稱空間處理,則為空字符串。

localName - 本地名稱(不帶前綴),如果沒有正在執(zhí)行名稱空間處理,則為空字符串。

qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則為空字符串。

attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。

public void characters(char[] ch, int start, int length)

ch - 文檔的所有字符。

start - 字符數(shù)組中的開始位置。

length - 從字符數(shù)組中使用的字符數(shù)。

public void endElement(String uri, String localName, String qName)

uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執(zhí)行名稱空間處理,則為空字符串。

localName - 本地名稱(不帶前綴),如果沒有正在執(zhí)行名稱空間處理,則為空字符串。

qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則為空字符串。

public void endDocument()

解析方式

通過解析器和事件處理器一起使用,可以解析XML文檔。解析器可以使用JAXP的API創(chuàng)建,創(chuàng)建出SAX解析器后,就可以指定解析器去解析某個XML文檔。事件處理器由程序員編寫,程序員通過事件處理器中方法的參數(shù),就可以很輕松地得到sax解析器解析到的數(shù)據(jù),從而可以決定如何對數(shù)據(jù)進行處理。

解析步驟

1、通過調(diào)用SAXParserFactory的newInstance()方法獲得Sax解析器工廠對象。

2、通過Sax解析器工廠對象調(diào)用newSAXParser()方法獲得解析器SAXParser對象

3、通過調(diào)用解析器對象的parse方法將解析器與事件處理器對象關(guān)聯(lián)

案例:

XML6.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<班級 班次="1班" 編號="C1">
	<學生 地址="湖南" 學號="n1" 性別="男" 授課方式="面授" 朋友="n2" 班級編號="C1">
		<名字>張三</名字>
		<年齡>20</年齡>
		<介紹>不錯</介紹>
	</學生>
	<學生 學號="n2" 性別="女" 授課方式="面授" 朋友="n1 n3" 班級編號="C1">
		<名字>李四</名字>
		<年齡>18</年齡>
		<介紹>很好</介紹>
	</學生>
	<學生 學號="n3" 性別="男" 授課方式="面授" 朋友="n2" 班級編號="C1">
		<名字>王五</名字>
		<年齡>22</年齡>
		<介紹>非常好</介紹>
	</學生>
	<學生 性別="男">
		<名字>小明</名字>
		<年齡>30</年齡>
		<介紹>好</介紹>
	</學生>
</班級>
package com.pc;
import javax.xml.parsers.*;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XML6{
	//使用sax技術(shù)去解析xml文件
	public static void main(String[] args) throws Exception, SAXException {
		// TODO Auto-generated method stub
		//1.創(chuàng)建SaxParserFactory
		SAXParserFactory spf=SAXParserFactory.newInstance();
		//2.創(chuàng)建SaxParser 解析器
		SAXParser saxParser=spf.newSAXParser();
		//3 把xml文件和事件處理對象關(guān)聯(lián)
		saxParser.parse("src/com/pc/XML6.xml",new MyDefaultHandler2() );
	}
}
// 只顯示學生的名字和年齡
class MyDefaultHandler2 extends DefaultHandler{
	private boolean isName=false;
	private boolean isAge=false;
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		String con=new String(ch,start,length);
		if(!con.trim().equals("")&&(isName||isAge)){
			System.out.println(con);
		}
		isName=false;
		isAge=false;
		//super.characters(ch, start, length);
	}
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
	}
	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, name);
	}
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
	}
	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if(name.equals("名字")){
			this.isName=true;
		}else if(name.equals("年齡")){
			this.isAge=true;
		}
	}
}
//定義事件處理類
class MyDefaultHandler1 extends DefaultHandler{
	//發(fā)現(xiàn)文檔開始
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		System.out.println("startDocument()");
		super.startDocument();
	}
	//發(fā)現(xiàn)xml文件中的一個元素
	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		System.out.println("元素名稱="+name);	
	}
	//發(fā)現(xiàn)xml文件中的文本
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String con=new String(ch,start,length);
		//顯示文本內(nèi)容:
		if(!con.trim().equals("")){
			System.out.println(new String(ch,start,length));
		}
	}
	//發(fā)現(xiàn)xml文件中一個元素介紹</xx>
	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, name);
	}
	//發(fā)現(xiàn)文檔結(jié)束
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		System.out.println("endDocument()");
		super.endDocument();
	}
}

以上是“XML編程中SAX的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI