XML編程-SAX

黄舟
黄舟原創
2017-02-20 15:11:131514瀏覽

XML編程-SAX

基本概述


    SAX,全名Simple API for XML,既是一種接口,也是一種軟體包。它是一種XML解析的替代方法。 SAX不同於DOM解析,它逐行掃描文檔,一邊掃描一邊解析。由於應用程式只是在讀取數據時檢查數據,因此不需要將數據儲存在記憶體中,這對於大型文件的解析是個巨大優勢。

    SAX是一個用於處理XML事件驅動的「推」模型,雖然它不是W3C標準,但它是一個得到了廣泛認可的APISAX解析器不像DOM那樣建立一個完整的文檔樹,而是在讀取文檔時激活一系列事件,這些事件被推給事件處理器,然後由事件處理器提供對文件內容的存取。

PSSAX不能夠對XML檔案進行修改,刪除、新增操作。

 

為什麼引進SAX技術?

    DOM技術也是非常好的DOM解析方案,為什麼還會出現SAX 技術呢?原因很簡單,那就是DOM是以文檔樹的結構對XML進行保存,這就表明是一次性將XML讀入內存,那麼這在大型的XML檔案中是不可能的。所以才產生了SAX這種掃描解析的技術。

 

原理圖


SAX解析機制


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

    在Java中,透過繼承DefaultHandler 接口,可以開發一個SAX解析器。

    SAX的解析機制和事件監聽機制很像,都是等待某一事件觸發,然後呼叫對應方法。

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

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

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

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

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

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

 

事件處理器常用方法參數清單

public void startDocument()

 

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

uri - 名稱空間 URI,若元素沒有任何名稱空間  URI,或沒有正在執行名稱空間處理,則為空字串。

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

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

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

 

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

ch - 文件的所有字元

start - 字元陣列中的開始位置。

length - 從字元陣列中使用的字元數。

 

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

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

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

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

 

public void endDocument()

 

解析方式

    透過解析器和事件處理器一起使用,可以解析XML文件。 解析器可以使用JAXPAPI創建,創建出SAX解析器後,就可以指定解析器去解析某個XML文件。事件處理器由程式設計師編寫,程式設計師透過事件處理器中方法的參數,就可以輕鬆地得到sax解析器解析到的數據,從而可以決定如何對數據進行處理。

 

解析步驟

1、透過呼叫SAXParserFactory newInstance()方法取得Sax解析器工廠物件。

2、透過Sax解析器工廠物件呼叫newSAXParser()方法取得解析器SAXParser物件

3、透過呼叫解析器物件的parse方法將解析器與事件處理器物件關聯

 

 

案例:

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技术去解析xml文件
	public static void main(String[] args) throws Exception, SAXException {
		// TODO Auto-generated method stub
		//1.创建SaxParserFactory
		SAXParserFactory spf=SAXParserFactory.newInstance();
		//2.创建SaxParser 解析器
		SAXParser saxParser=spf.newSAXParser();
		//3 把xml文件和事件处理对象关联
		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{
	//发现文档开始
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		System.out.println("startDocument()");
		super.startDocument();
	}
	//发现xml文件中的一个元素
	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		System.out.println("元素名称="+name);	
	}
	//发现xml文件中的文本
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String con=new String(ch,start,length);
		//显示文本内容:
		if(!con.trim().equals("")){
			System.out.println(new String(ch,start,length));
		}
	}
	//发现xml文件中一个元素介绍</xx>
	@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 endDocument() throws SAXException {
		// TODO Auto-generated method stub
		System.out.println("endDocument()");
		super.endDocument();
	}
}

 以上就是XML程式設計-SAX 的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn