更新時(shí)間:2020-11-30 17:49:26 來源:動力節(jié)點(diǎn) 瀏覽1519次
SAX,全稱 Simple API for XML,是一種以事件驅(qū)動的 XMl API,即XML 簡單應(yīng)用程序接口。解析 XML 元素名稱和內(nèi)容的關(guān)鍵是當(dāng) SAX 解析 XML 時(shí),把元素的名稱和內(nèi)容及時(shí)保存起來,同時(shí) XML 中可能會有很多同名的元素,要把元素名稱和內(nèi)容對應(yīng)起來。
與 DOM 不同,SAX 提供的訪問模式是一種順序模式,這是一種快速讀寫 XML 數(shù)據(jù)的方式。當(dāng)使用 SAX 分析器對 XML 文檔進(jìn)行分析時(shí),會觸發(fā)一系列事件,并激活相應(yīng)的事件處理函數(shù),應(yīng)用程序通過這些事件處理函數(shù)實(shí)現(xiàn)對XML文檔的訪問,因而SAX接口也被稱作事件驅(qū)動接口。
SAX 解析 XML 的一般步驟:
1.創(chuàng)建 SAXParserFactory 的對象
2.創(chuàng)建 SAXParser 對象 (解析器)
3.創(chuàng)建一個(gè) DefaultHandler 的子類,需要重寫5個(gè)方法
1)解析xml文檔開始時(shí)調(diào)用
startDocument()
2)解析xml文檔結(jié)束時(shí)調(diào)用
endDocument()
3)解析xml文檔中的開始節(jié)點(diǎn)時(shí)調(diào)用
startElement(String uri, String localName, String qName, Attributes attributes)
4)解析xml文檔中的結(jié)束節(jié)點(diǎn)時(shí)調(diào)用
endElement(String uri, String localName, String qName)
5)解析xml文檔中的節(jié)點(diǎn)中的文本值時(shí)調(diào)用
characters(char[] ch, int start, int length)
4) 調(diào)用 parse 方法
了解了SAX 解析 XML 的步驟,我們開始進(jìn)行實(shí)戰(zhàn)解析:
DefaultHandler 子類:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class BookDefaultHandler extends DefaultHandler{
/** 解析xml文檔開始時(shí)調(diào)用 */
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("------解析XML文檔開始------");
}
/** 解析xml文檔中的開始節(jié)點(diǎn)時(shí)調(diào)用 */
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// System.out.println("解析XML文檔的開始節(jié)點(diǎn)");
System.out.print("<" + qName + " ");
/* 判斷:如果是book節(jié)點(diǎn),獲取節(jié)點(diǎn)的屬性值 */
if(qName.equals("book")) {
//獲取所有的屬性
int count = attributes.getLength();
for (int i = 0; i < count; i++) {
String attrName = attributes.getQName(i);
String attrValue = attributes.getValue(i);
System.out.print(attrName + "=\"" + attrValue
+ "\" ");
}
}
System.out.println(">");
}
/** 解析xml文檔中的結(jié)束節(jié)點(diǎn)時(shí)調(diào)用 */
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("</" + qName + ">");
}
/** 解析xml文檔中的節(jié)點(diǎn)中的文本值時(shí)調(diào)用 */
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String value = new String(ch, start, length);
//去掉空白節(jié)點(diǎn)
if(!value.trim().equals("")) {
System.out.println(value);
}
}
/** 解析xml文檔結(jié)束時(shí)調(diào)用 */
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("------解析XML文檔結(jié)束------");
}
}
SAX解析測試類:
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class TestSAXParse {
public static void main(String[] args)
throws ParserConfigurationException, SAXException, IOException {
//1) 創(chuàng)建 SAXParserFactory 的對象
SAXParserFactory factory = SAXParserFactory.newInstance();
//2) 創(chuàng)建 SAXParser 對象 (解析器)
SAXParser parser = factory.newSAXParser();
//3) 創(chuàng)建一個(gè) DefaultHandler 的子類,需要重寫5個(gè)方法
BookDefaultHandler bdh = new BookDefaultHandler();
//4) 調(diào)用 parse 方法
parser.parse("book.xml", bdh);
}
}
盡管SAX解析XML不是XML的解析方式的唯一,但SAX解析XML仍在XML解析方式中占據(jù)一席之地,除了SAX解析XML采用事件驅(qū)動模式,對內(nèi)存耗費(fèi)比較小之外,SAX解析XML在只處理XML文件中的數(shù)據(jù)時(shí)無疑是最佳選擇。當(dāng)然SAX解析XML也不是沒有缺點(diǎn)的,事實(shí)上SAX解析XML很難同時(shí)訪問XML文件中的多處不同數(shù)據(jù)而被詬病。想要了解更多的XML知識,快來觀看本站的XML教程吧,助你快速熟練掌握XML知識。

初級 202925

初級 203221

初級 202629

初級 203743