第8章XML解析器—SAX_第1頁(yè)
第8章XML解析器—SAX_第2頁(yè)
第8章XML解析器—SAX_第3頁(yè)
第8章XML解析器—SAX_第4頁(yè)
第8章XML解析器—SAX_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、XML基礎(chǔ)教程第8章 XML解析器SAX第1頁(yè)第第8章章 XML解析器解析器SAX 本章概述本章概述 本章的學(xué)習(xí)目標(biāo)本章的學(xué)習(xí)目標(biāo)主要內(nèi)容主要內(nèi)容XML基礎(chǔ)教程第8章 XML解析器SAX第2頁(yè)本章概述本章概述l除除DOM之外,之外,SAX(Simple API for XML)是解)是解析析XML文檔的另一種接口,它以流的方式將文檔的另一種接口,它以流的方式將XML文檔讀取到內(nèi)存中,以事件模型的方式解析處理文檔讀取到內(nèi)存中,以事件模型的方式解析處理XML文檔,獲取文檔,獲取XML文檔中的信息。文檔中的信息。l當(dāng)當(dāng)XML文檔比較大時(shí),構(gòu)建文檔比較大時(shí),構(gòu)建DOM樹(shù)將花費(fèi)大量的樹(shù)將花費(fèi)大量的時(shí)間和

2、內(nèi)存。對(duì)于一些幾十兆、甚至上百兆的較時(shí)間和內(nèi)存。對(duì)于一些幾十兆、甚至上百兆的較大的大的XML文檔來(lái)說(shuō),使用文檔來(lái)說(shuō),使用DOM解析將有可能導(dǎo)致解析將有可能導(dǎo)致內(nèi)存溢出。而內(nèi)存溢出。而SAX允許在讀取文檔時(shí)對(duì)它處理,允許在讀取文檔時(shí)對(duì)它處理,解析完畢處理也完成了,不必等到整個(gè)文檔被分解析完畢處理也完成了,不必等到整個(gè)文檔被分析存儲(chǔ)之后才進(jìn)行操作。析存儲(chǔ)之后才進(jìn)行操作。XML基礎(chǔ)教程第8章 XML解析器SAX第3頁(yè)本章的學(xué)習(xí)目標(biāo)本章的學(xué)習(xí)目標(biāo)l了解了解SAX的基本特點(diǎn)的基本特點(diǎn)l掌握掌握SAX事件處理器和事件處理器和SAX事件事件l掌握掌握SAX常用接口及回調(diào)方法常用接口及回調(diào)方法l會(huì)使用會(huì)使用S

3、AX解析解析XML文檔文檔l了解了解SAX錯(cuò)誤信息錯(cuò)誤信息XML基礎(chǔ)教程第8章 XML解析器SAX第4頁(yè)主要內(nèi)容主要內(nèi)容8.1 SAX簡(jiǎn)介簡(jiǎn)介8.2 SAX的特點(diǎn)的特點(diǎn) 8.3 SAX工作機(jī)制工作機(jī)制8.4 利用利用SAX解析解析XML8.5 SAX錯(cuò)誤信息錯(cuò)誤信息8.6 SAX與與DOM8.7 本章小結(jié)本章小結(jié) XML基礎(chǔ)教程第8章 XML解析器SAX第5頁(yè)8.1 SAX簡(jiǎn)介簡(jiǎn)介lSAX即簡(jiǎn)易應(yīng)用程序編寫(xiě)接口,最初由即簡(jiǎn)易應(yīng)用程序編寫(xiě)接口,最初由David Megginson采用采用Java語(yǔ)言開(kāi)發(fā),語(yǔ)言開(kāi)發(fā), 1998年年5月,月,SAX1.0版由版由XML-DEV正式發(fā)布。正式發(fā)布。SA

4、X作為一種作為一種公開(kāi)的、開(kāi)放性源代碼,現(xiàn)在已經(jīng)被改寫(xiě)為其他公開(kāi)的、開(kāi)放性源代碼,現(xiàn)在已經(jīng)被改寫(xiě)為其他多種語(yǔ)言,例如多種語(yǔ)言,例如C#等。等。 l目前目前SAX最新的版本是最新的版本是2.0。在。在2.0版本中增加了版本中增加了對(duì)名稱(chēng)空間的支持,而且可以設(shè)置解析器是否對(duì)對(duì)名稱(chēng)空間的支持,而且可以設(shè)置解析器是否對(duì)文檔進(jìn)行有效性驗(yàn)證,以及怎樣來(lái)處理帶有名稱(chēng)文檔進(jìn)行有效性驗(yàn)證,以及怎樣來(lái)處理帶有名稱(chēng)空間的元素名稱(chēng)等??臻g的元素名稱(chēng)等。SAX2.0版本在多處不兼容版本在多處不兼容1.0版本,版本,SAX1.0中的接口在中的接口在SAX2.0中已經(jīng)不再中已經(jīng)不再使用了。使用了。 XML基礎(chǔ)教程第8章 X

5、ML解析器SAX第6頁(yè)8.1 SAX簡(jiǎn)介簡(jiǎn)介lSAX與大多數(shù)與大多數(shù)SAX標(biāo)準(zhǔn)族的最大不同之處在于標(biāo)準(zhǔn)族的最大不同之處在于SAX和和W3C組織沒(méi)有任何關(guān)系,但它是組織沒(méi)有任何關(guān)系,但它是XML社區(qū)社區(qū)事實(shí)上的標(biāo)準(zhǔn)。它在事實(shí)上的標(biāo)準(zhǔn)。它在XML中的應(yīng)用絲毫不比中的應(yīng)用絲毫不比DOM少,幾乎所有的少,幾乎所有的XML解析器都支持它。與解析器都支持它。與DOM相相比,比,SAX是一種輕量型的方法。是一種輕量型的方法。l不同于其他大多數(shù)不同于其他大多數(shù)XML標(biāo)準(zhǔn),標(biāo)準(zhǔn),SAX沒(méi)有語(yǔ)言開(kāi)發(fā)沒(méi)有語(yǔ)言開(kāi)發(fā)商必須遵守的標(biāo)準(zhǔn)商必須遵守的標(biāo)準(zhǔn)SAX參考版本。因此,參考版本。因此,SAX的的不同實(shí)現(xiàn)方式可能會(huì)采用區(qū)

6、別較大的接口。事實(shí)不同實(shí)現(xiàn)方式可能會(huì)采用區(qū)別較大的接口。事實(shí)上,所有實(shí)現(xiàn)中至少有一個(gè)特性是完全一樣的,上,所有實(shí)現(xiàn)中至少有一個(gè)特性是完全一樣的,即事件驅(qū)動(dòng)。即事件驅(qū)動(dòng)。XML基礎(chǔ)教程第8章 XML解析器SAX第7頁(yè)8.1 SAX簡(jiǎn)介簡(jiǎn)介 在在SAX API中有兩個(gè)中有兩個(gè)包包:lorg.xml.sax主要定義了主要定義了SAX的一些基礎(chǔ)接口,的一些基礎(chǔ)接口,如如XMLReader、ContentHandler、ErrorHandler、DTDHandler、EntityResolver等。等。lorg.xml.sax.helper:提供了一些方便開(kāi)發(fā)人員:提供了一些方便開(kāi)發(fā)人員使用的幫助類(lèi),如

7、缺省實(shí)現(xiàn)所有處理器接口的幫使用的幫助類(lèi),如缺省實(shí)現(xiàn)所有處理器接口的幫助類(lèi)助類(lèi)DefaultHandler、方便開(kāi)發(fā)人員創(chuàng)建、方便開(kāi)發(fā)人員創(chuàng)建XMLReader的的XMLReaderFactory類(lèi)等。類(lèi)等。XML基礎(chǔ)教程第8章 XML解析器SAX第8頁(yè)主要內(nèi)容主要內(nèi)容8.1 SAX簡(jiǎn)介簡(jiǎn)介8.2 SAX的特點(diǎn)的特點(diǎn) 8.3 SAX工作機(jī)制工作機(jī)制8.4 利用利用SAX解析解析XML8.5 SAX錯(cuò)誤信息錯(cuò)誤信息8.6 SAX與與DOM8.7 本章小結(jié)本章小結(jié) XML基礎(chǔ)教程第8章 XML解析器SAX第9頁(yè)8.2 SAX的特點(diǎn)的特點(diǎn) 由由于于SAX是一種簡(jiǎn)易的是一種簡(jiǎn)易的API接口,實(shí)現(xiàn)該接口后

8、接口,實(shí)現(xiàn)該接口后,SAX可以用來(lái)讀取可以用來(lái)讀取XML文檔的信息。它具有以下文檔的信息。它具有以下幾個(gè)優(yōu)點(diǎn):幾個(gè)優(yōu)點(diǎn):1. 可可以解析任意大小的文件以解析任意大小的文件 因?yàn)镾AX不需要把整個(gè)文件加載到內(nèi)存中,所以對(duì)內(nèi)存的占用比DOM少得多,而且不會(huì)隨著文件大小的增大而增加。DOM使用的實(shí)際內(nèi)存數(shù)量要視解析器而定,在大多數(shù)情況下,一個(gè)100K的文檔至少要占用1K的內(nèi)存。仍需注意的是,如果SAX應(yīng)用程序自身在內(nèi)存中創(chuàng)建文檔的表達(dá),它會(huì)占用內(nèi)存并允許解析器創(chuàng)建相同大小空間的內(nèi)存。XML基礎(chǔ)教程第8章 XML解析器SAX第10頁(yè)8.2 SAX的特點(diǎn)的特點(diǎn)2. 適合創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu)適合創(chuàng)建自己的數(shù)

9、據(jù)結(jié)構(gòu) 應(yīng)用程序可能會(huì)使用書(shū)、作者以及出版社等這樣的高級(jí)對(duì)象,而不是一些低級(jí)元素、屬性和處理指令來(lái)創(chuàng)建數(shù)據(jù)結(jié)構(gòu)。這些交易對(duì)象可能只和XML文件內(nèi)容有一點(diǎn)關(guān)系。 比如,它們可能只是組合XML文件和其他數(shù)據(jù)源的數(shù)據(jù)。在這種情況下,如果想在內(nèi)存中創(chuàng)建面向應(yīng)用的數(shù)據(jù)結(jié)構(gòu),先創(chuàng)建一個(gè)低級(jí)的DOM結(jié)構(gòu)然后破壞它是很不合理的,而SAX可以?xún)H在每個(gè)事件發(fā)生時(shí)處理這些數(shù)據(jù),這樣能夠保證商務(wù)對(duì)象模型合理地變動(dòng)。XML基礎(chǔ)教程第8章 XML解析器SAX第11頁(yè)8.2 SAX的特點(diǎn)的特點(diǎn)3. 適合小信息子集適合小信息子集 如果僅對(duì)XML文檔的部分?jǐn)?shù)據(jù)感興趣,將全部數(shù)據(jù)讀入內(nèi)存是非常低效和不必要的,只需要將要用到的數(shù)據(jù)

10、讀取過(guò)來(lái)即可。SAX的一個(gè)優(yōu)點(diǎn)就是可以非常容易地忽略不必要的數(shù)據(jù)信息。4. 簡(jiǎn)單且快速簡(jiǎn)單且快速 SAX非常易于使用,它是基于事件模型的,可以使類(lèi)的層次和結(jié)構(gòu)非常清晰。如果可以從文檔的簡(jiǎn)單序列中獲取XML信息,SAX一定是最快的方法,能夠非常快速地獲取數(shù)據(jù)。XML基礎(chǔ)教程第8章 XML解析器SAX然而,然而,SAX也不可避免地在某些方面存在遺憾,也不可避免地在某些方面存在遺憾,它的缺點(diǎn)有如下幾個(gè)方面:它的缺點(diǎn)有如下幾個(gè)方面:1. 不不能對(duì)文檔進(jìn)行隨機(jī)存取能對(duì)文檔進(jìn)行隨機(jī)存取 因?yàn)槲臋n并不加載到內(nèi)存,所以必須按照數(shù)據(jù)提交的次序進(jìn)行處理。如果文檔中包含許多內(nèi)部交叉引用,如使用ID和IDREF屬性,

11、SAX使用起來(lái)會(huì)較為困難。2. 不不可獲取詞法信息可獲取詞法信息 SAX的設(shè)計(jì)原理是它不提供詞法信息。SAX設(shè)法告知文檔作者想要說(shuō)明什么,而不是讓你忙于研究其說(shuō)明方式的細(xì)節(jié)。8.2 SAX的特點(diǎn)的特點(diǎn)XML基礎(chǔ)教程第8章 XML解析器SAX3. SAX是只讀的是只讀的 DOM可以從XML源文件中讀取文檔,也可以創(chuàng)建和修改內(nèi)存中的文檔。相比較而言,SAX只能讀取XML文檔而不能編寫(xiě)文檔。但在實(shí)際使用中,我們可以通過(guò)一些彌補(bǔ)措施,使SAX接口可以很容易地編寫(xiě)文檔。4. 當(dāng)當(dāng)前的瀏覽器不支持前的瀏覽器不支持SAX 盡管有許多支持SAX接口的XML解析器,但還沒(méi)有一個(gè)主流的Web瀏覽器內(nèi)置XML解析器

12、以支持SAX接口。我們當(dāng)然可以把兼容SAX的解析器合成到一個(gè)Java applet程序中去,但是從服務(wù)器下載applet的成本會(huì)使低速接入互聯(lián)網(wǎng)的用戶(hù)失去耐心。實(shí)際上,客戶(hù)端XML編程可選擇的接口是相當(dāng)有限的。8.2 SAX的特點(diǎn)的特點(diǎn)XML基礎(chǔ)教程第8章 XML解析器SAX第14頁(yè)主要內(nèi)容主要內(nèi)容8.1 SAX簡(jiǎn)介簡(jiǎn)介8.2 SAX的特點(diǎn)的特點(diǎn) 8.3 SAX工作機(jī)制工作機(jī)制8.4 利用利用SAX解析解析XML8.5 SAX錯(cuò)誤信息錯(cuò)誤信息8.6 SAX與與DOM8.7 本章小結(jié)本章小結(jié) XML基礎(chǔ)教程第8章 XML解析器SAX8.3 SAX工作機(jī)制工作機(jī)制第15頁(yè)8.3.1 事件處理器事件

13、處理器 SAX與與DOM在概念上完全不同。不同于在概念上完全不同。不同于DOM的文檔驅(qū)動(dòng),的文檔驅(qū)動(dòng),SAX是事件驅(qū)動(dòng)的是事件驅(qū)動(dòng)的,也就是說(shuō),它不需要讀入整個(gè)文檔,而文檔的讀入過(guò)程也就是,也就是說(shuō),它不需要讀入整個(gè)文檔,而文檔的讀入過(guò)程也就是SAX的解析過(guò)程。的解析過(guò)程。所謂事件驅(qū)動(dòng),是一種基于回調(diào)(所謂事件驅(qū)動(dòng),是一種基于回調(diào)(callback)機(jī)制的程序運(yùn)行方法,也可以把它稱(chēng))機(jī)制的程序運(yùn)行方法,也可以把它稱(chēng)為授權(quán)事件模型。為授權(quán)事件模型。 授授權(quán)事件模型中可以產(chǎn)生事件的對(duì)象被稱(chēng)為事件源,可以針對(duì)事件產(chǎn)生響應(yīng)的權(quán)事件模型中可以產(chǎn)生事件的對(duì)象被稱(chēng)為事件源,可以針對(duì)事件產(chǎn)生響應(yīng)的對(duì)象被稱(chēng)為事

14、件處理器。事件和事件處理器是通過(guò)在事件源中的事件處理器注冊(cè)的對(duì)象被稱(chēng)為事件處理器。事件和事件處理器是通過(guò)在事件源中的事件處理器注冊(cè)的方法連接的方法連接的。在。在事件源調(diào)用事件處理器中特定方法的時(shí)候,還要傳遞給事件處理器事件源調(diào)用事件處理器中特定方法的時(shí)候,還要傳遞給事件處理器相應(yīng)事件的狀態(tài)信相應(yīng)事件的狀態(tài)信息。息。 DefaultHandler類(lèi)或它的子類(lèi)的對(duì)象稱(chēng)為類(lèi)或它的子類(lèi)的對(duì)象稱(chēng)為SAX解析器的事件處理器。事件處理解析器的事件處理器。事件處理器可以接收解析器報(bào)告的所有事件,處理所發(fā)現(xiàn)的數(shù)據(jù)。器可以接收解析器報(bào)告的所有事件,處理所發(fā)現(xiàn)的數(shù)據(jù)。DefaultHandler類(lèi)實(shí)現(xiàn)了類(lèi)實(shí)現(xiàn)了Co

15、ntentHandler接口、接口、DTDHandler接口、接口、EntityResolver接口和接口和ErrorHandler接口接口。XML基礎(chǔ)教程第8章 XML解析器SAX第16頁(yè)8.3.2 SAX事件事件 SAX解析器在加載解析器在加載XML文檔時(shí),遍歷文檔時(shí),遍歷XML文檔并在其主機(jī)應(yīng)用程序中文檔并在其主機(jī)應(yīng)用程序中產(chǎn)生事件(經(jīng)由回調(diào)函數(shù)、指派函數(shù)或者任何可調(diào)用平臺(tái)來(lái)完成這一功能)產(chǎn)生事件(經(jīng)由回調(diào)函數(shù)、指派函數(shù)或者任何可調(diào)用平臺(tái)來(lái)完成這一功能)表示這一過(guò)程。這樣,編寫(xiě)表示這一過(guò)程。這樣,編寫(xiě)SAX應(yīng)用程序就如同采用最現(xiàn)代的工具編寫(xiě)應(yīng)用程序就如同采用最現(xiàn)代的工具編寫(xiě)GUI事件程序

16、一樣。大多數(shù)事件程序一樣。大多數(shù)SAX實(shí)現(xiàn)都會(huì)產(chǎn)生以下幾種類(lèi)型的事件:實(shí)現(xiàn)都會(huì)產(chǎn)生以下幾種類(lèi)型的事件:l 在文檔開(kāi)始和結(jié)束時(shí)觸發(fā)文檔處理事件。在文檔開(kāi)始和結(jié)束時(shí)觸發(fā)文檔處理事件。l 在文檔內(nèi)每一個(gè)在文檔內(nèi)每一個(gè)XML元素都在接受解析的前后觸發(fā)元素事件。元素都在接受解析的前后觸發(fā)元素事件。l 在處理文檔的在處理文檔的DTD或或Schema時(shí)產(chǎn)生時(shí)產(chǎn)生DTD或或Schema事件。事件。l 錯(cuò)誤事件用來(lái)通知主機(jī)應(yīng)用程序解析錯(cuò)誤。錯(cuò)誤事件用來(lái)通知主機(jī)應(yīng)用程序解析錯(cuò)誤。8.3 SAX工作機(jī)制工作機(jī)制XML基礎(chǔ)教程第8章 XML解析器SAX第17頁(yè)SAX解析器中主要有以下解析器中主要有以下5種事件:種事件

17、:1.startDocument事件事件 該事件表明SAX解析器發(fā)現(xiàn)了文檔的開(kāi)始。該事件沒(méi)有傳遞任何信息,只是表明解析器開(kāi)始掃描文檔。當(dāng)遇到文檔的開(kāi)頭時(shí),調(diào)用這個(gè)方法,可以在其中做一些預(yù)處理的工作。8.3 SAX工作機(jī)制工作機(jī)制XML基礎(chǔ)教程第8章 XML解析器SAX第18頁(yè)2.startElement事件事件 該事件表明SAX解析器發(fā)現(xiàn)了XML文檔中的一個(gè)元素的起始標(biāo)簽。該事件會(huì)返回該元素的名稱(chēng)、屬性的名稱(chēng)和值。如果應(yīng)用程序需要查找XML中某個(gè)元素的內(nèi)容,該事件將會(huì)通知該元素何時(shí)開(kāi)始。該事件處理程序包含以下4個(gè)參數(shù):u namespaceURI:命名空間URI。如果XML文檔沒(méi)有使用命名空間

18、,該參數(shù)將會(huì)是一個(gè)空字符串。u localname:該元素的非限定名。u qName:該元素的限定名,即命名空間前綴與元素本地名稱(chēng)的組合。u atts:包含該元素所有屬性的一個(gè)對(duì)象。該對(duì)象提供了幾種方法獲取屬性的名稱(chēng)和值,以及該元素的屬性個(gè)數(shù)。8.3 SAX工作機(jī)制工作機(jī)制XML基礎(chǔ)教程第8章 XML解析器SAX第19頁(yè)3.characters事件事件 該事件表明SAX解析器發(fā)現(xiàn)XML文檔中的一個(gè)元素的文本信息。返回的信息包括一個(gè)字符串?dāng)?shù)組、該數(shù)組的偏移量和一個(gè)長(zhǎng)度變量,通過(guò)這3個(gè)變量就可以訪(fǎng)問(wèn)所發(fā)現(xiàn)的文本信息了。如果應(yīng)用程序需要存儲(chǔ)特定元素的內(nèi)容,可以把存儲(chǔ)那些內(nèi)容的代碼寫(xiě)在該事件處理程序中

19、。該事件處理程序包含3個(gè)參數(shù):namespaceURI、localname和qName。uch:解析器所發(fā)現(xiàn)的字符串?dāng)?shù)組。ustart:屬于該事件的字符串?dāng)?shù)組中的一個(gè)字符的起始下標(biāo)。ulength:該事件中字符個(gè)數(shù)。8.3 SAX工作機(jī)制工作機(jī)制XML基礎(chǔ)教程第8章 XML解析器SAX第20頁(yè)4.endElement事件事件 該事件表明SAX解析器發(fā)現(xiàn)XML文檔中的一個(gè)元素的結(jié)束標(biāo)簽。該事件會(huì)返回該元素的名稱(chēng)以及相關(guān)的命名空間信息。該事件處理程序包含3個(gè)參數(shù):namespaceURI、localname和qName。5.endDocument事件事件 該事件表明SAX解析器已經(jīng)發(fā)現(xiàn)XML文檔的

20、結(jié)尾。和上面的方法對(duì)應(yīng),當(dāng)文檔結(jié)束的時(shí)候,調(diào)用這個(gè)方法,可以在其中做一些善后的工作。8.3 SAX工作機(jī)制工作機(jī)制XML基礎(chǔ)教程第8章 XML解析器SAX第21頁(yè)8.3.3 SAX常用接口常用接口 SAX是一個(gè)接口,即一套是一個(gè)接口,即一套API,在,在SAX接口里聲明了處接口里聲明了處理理XML文檔時(shí)所需要的方法。利用文檔時(shí)所需要的方法。利用SAX編寫(xiě)的程序,可以編寫(xiě)的程序,可以快速地對(duì)數(shù)據(jù)進(jìn)行操作??焖俚貙?duì)數(shù)據(jù)進(jìn)行操作。SAX接口中常用的有以下幾種:接口中常用的有以下幾種:1.Attributes接口接口A(yíng)ttributes接口表示XML屬性列表的接口。此接口允許用以下3種不同方式訪(fǎng)問(wèn)屬性

21、列表: 通過(guò)屬性索引; 通過(guò)命名空間限定的名稱(chēng); 通過(guò)限定(前綴)名。該列表將不包括被聲明為#IMPLIED但未在啟動(dòng)標(biāo)記中指定的那些屬性。XML基礎(chǔ)教程第8章 XML解析器SAX第22頁(yè)8.3.3 SAX常用接口常用接口2.contentHandler接口接口ContentHandler接口位于org.xml.sax包中。該接口是接收文檔邏輯內(nèi)容的通知接口。這是一個(gè)大多數(shù)SAX應(yīng)用程序?qū)嵤┑闹饕涌?,如果需要通知?yīng)用程序解析基本事件,則它將實(shí)現(xiàn)此接口,并使用setcontentHandler方法向SAX解析器注冊(cè)一個(gè)實(shí)例,解析器將使用該實(shí)例報(bào)告與基本文檔相關(guān)的事件,如啟動(dòng)和終止元素與字符數(shù)據(jù)

22、等。在此接口中,事件的順序非常重要,它本身可鏡像文檔中事件的順序。XML基礎(chǔ)教程第8章 XML解析器SAX第23頁(yè)8.3.3 SAX常用接口常用接口3.DTDHandler接口接口 DTDHandler接口定義了一些不常用的方法,位于org.xml.sax包中。該接口接收基本的與DTD相關(guān)事件的通知,如果SAX應(yīng)用程序需要關(guān)于注釋和未解析實(shí)體的信息,則該應(yīng)用程序?qū)崿F(xiàn)此接口,并使用SAX解析器的setDTDHandler方法向該解析器注冊(cè)一個(gè)實(shí)例,解析器使用該實(shí)例向應(yīng)用程序報(bào)告注釋和未解析的實(shí)體信息。XML基礎(chǔ)教程第8章 XML解析器SAX第24頁(yè)8.3.3 SAX常用接口常用接口4.Entit

23、yResolver接口接口 EntityResolver接口是用于解析實(shí)體的基本接口,位于org.xml.sax包中。如果SAX應(yīng)用程序需要實(shí)現(xiàn)自定義處理外部實(shí)體,則必須實(shí)現(xiàn)此接口,并使用setEntityResolver方法向SAX解析器注冊(cè)一個(gè)實(shí)例,然后XML將允許應(yīng)用程序在包含外部實(shí)體之前截取任何外部實(shí)體,包括外部DTD子集和外部參數(shù)實(shí)體。XML基礎(chǔ)教程第8章 XML解析器SAX第25頁(yè)8.3.3 SAX常用接口常用接口5.XMLReader接口接口 該接口用于使用回調(diào)讀取XML文檔的接口。XML Reader是XML解析器的SAX 2.0驅(qū)動(dòng)程序必須實(shí)現(xiàn)的接口,此接口允許應(yīng)用程序設(shè)置和

24、查詢(xún)解析器中的功能和屬性、注冊(cè)文檔處理的事件處理程序,以及開(kāi)始文檔解析等。所有的SAX接口都假定是同步的:必須在分解完成后返回parse方法,而且閱讀器必須等到事件處理程序回調(diào)返回后才能報(bào)告下一個(gè)事件。XML基礎(chǔ)教程第8章 XML解析器SAX第26頁(yè)6.ErrorHandler接口接口 ErrorHandler接口是SAX錯(cuò)誤處理程序的基本接口,用于處理XML文件中所出現(xiàn)的各種錯(cuò)誤事件。該接口提供了3個(gè)層次的錯(cuò)誤處理:警告(warning)、錯(cuò)誤(error)和致命錯(cuò)誤(fatal error)。ErrorHandler接口定義了3個(gè)方法,分別處理這3個(gè)層次錯(cuò)誤,見(jiàn)表8-1。方法方法描述描述v

25、oid warning(SAXParseException exception)處理警告層次的錯(cuò)誤void error(SAXParseException exception)處理一般錯(cuò)誤void fatalError(SAXParseException exception)處理致命錯(cuò)誤XML基礎(chǔ)教程第8章 XML解析器SAX第27頁(yè)8.3.4 SAX回調(diào)方法回調(diào)方法通過(guò)一個(gè)例子來(lái)看看SAX解析器回調(diào)的方法?!纠?-1】SAX回調(diào)方法示例。首先看一個(gè)簡(jiǎn)單的XML文檔: CRXML簡(jiǎn)明教程清華大學(xué)出版社當(dāng)SAX解析器讀到標(biāo)簽時(shí),將會(huì)回調(diào)startElement()方法,并把標(biāo)簽名“圖書(shū)”作為參數(shù)

26、傳遞過(guò)去。在用戶(hù)實(shí)現(xiàn)startElement()方法中需要定義相應(yīng)的內(nèi)容,處理出現(xiàn)時(shí)應(yīng)該做的操作。各個(gè)事件隨著解析的過(guò)程,即文檔讀入的過(guò)程,一個(gè)個(gè)順序產(chǎn)生,相應(yīng)的方法也會(huì)被順序調(diào)用,當(dāng)解析完成時(shí),事件處理方法都被調(diào)用后,對(duì)文檔的處理也就完成了。XML基礎(chǔ)教程第8章 XML解析器SAX第28頁(yè)表8-2 SAX回調(diào)方法執(zhí)行順序遇到的元素遇到的元素回調(diào)的方法回調(diào)的方法文檔開(kāi)始文檔開(kāi)始startDocument()startElement(null, “圖書(shū)”,null,Attributes)“n”Characters(“n”,6,1)startElement(null, “作者”,null,Attr

27、ibutes)“CR”Characters(“n”,15,10)endElement (null, “作者”,null)“n”Characters(“n”,34,1)startElement(null, “書(shū)名”,null,Attributes)“XML簡(jiǎn)明教程簡(jiǎn)明教程”Characters(“n”,42,5)startElement(null, “出版社”,null,Attributes)“n”Characters(“n”,55,1)startElement(null, “出版社”,null,Attributes)“清華大學(xué)出版社清華大學(xué)出版社”Characters(“n”,62,4)end

28、Element (null, “出版社”,null)“n”Characters(“n”,67,1)endElement (null, “圖書(shū)”,null)文檔結(jié)束文檔結(jié)束endDocument()XML基礎(chǔ)教程第8章 XML解析器SAX第29頁(yè)主要內(nèi)容主要內(nèi)容8.1 SAX簡(jiǎn)介簡(jiǎn)介8.2 SAX的特點(diǎn)的特點(diǎn) 8.3 SAX工作機(jī)制工作機(jī)制8.4 利用利用SAX解析解析XML8.5 SAX錯(cuò)誤信息錯(cuò)誤信息8.6 SAX與與DOM8.7 本章小結(jié)本章小結(jié) XML基礎(chǔ)教程第8章 XML解析器SAX8.4 使用使用SAX解析解析XML第30頁(yè)8.4.1 SAX解析解析XML文檔文檔lSAX 允許在讀取

29、文檔時(shí)處理它,從而不必等待允許在讀取文檔時(shí)處理它,從而不必等待整個(gè)文檔被存儲(chǔ)之后才采取操作。整個(gè)文檔被存儲(chǔ)之后才采取操作。SAX API是是一個(gè)基于事件的一個(gè)基于事件的API ,適用于處理數(shù)據(jù)流,即,適用于處理數(shù)據(jù)流,即隨著數(shù)據(jù)的流動(dòng)而依次處理數(shù)據(jù)。隨著數(shù)據(jù)的流動(dòng)而依次處理數(shù)據(jù)。SAX API 在在其解析文檔時(shí)發(fā)生一定事件的時(shí)候會(huì)發(fā)出通知。其解析文檔時(shí)發(fā)生一定事件的時(shí)候會(huì)發(fā)出通知。在對(duì)其響應(yīng)時(shí),不作保存的數(shù)據(jù)將會(huì)被拋棄。在對(duì)其響應(yīng)時(shí),不作保存的數(shù)據(jù)將會(huì)被拋棄。下面是一個(gè)下面是一個(gè)SAX解析解析XML的示例。的示例。XML基礎(chǔ)教程第8章 XML解析器SAX第31頁(yè)【例8-2】SAX解析XML文檔

30、。 李晟 維修技工 利用SAX解析XML文檔,涉及兩個(gè)部分:解析器和事件處理器。解析器負(fù)責(zé)讀取XML文檔,并向事件處理器發(fā)送事件。如元素開(kāi)始和元素結(jié)束;事件處理器則負(fù)責(zé)對(duì)事件做出響應(yīng),對(duì)傳遞的XML數(shù)據(jù)進(jìn)行處理。XML基礎(chǔ)教程第8章 XML解析器SAX第32頁(yè)8.4.2 處理空白處理空白l在在XML文件中,標(biāo)記之間的縮進(jìn)區(qū)域都是為了使文件中,標(biāo)記之間的縮進(jìn)區(qū)域都是為了使XML文件看起來(lái)更加美觀(guān)。但是解析器卻把它們文件看起來(lái)更加美觀(guān)。但是解析器卻把它們作為文本數(shù)據(jù)來(lái)處理。作為文本數(shù)據(jù)來(lái)處理。l在處理文本事件時(shí),會(huì)調(diào)用在處理文本事件時(shí),會(huì)調(diào)用characters()方法來(lái)方法來(lái)處理,一并處理文本之

31、間的空白字符,這樣會(huì)延處理,一并處理文本之間的空白字符,這樣會(huì)延長(zhǎng)整個(gè)程序的執(zhí)行時(shí)間。長(zhǎng)整個(gè)程序的執(zhí)行時(shí)間。l可可以采用下面的方法處理空白:以采用下面的方法處理空白: public void ignorableWhitespace(char ch, int start, int length)throws SAXEceptionXML基礎(chǔ)教程第8章 XML解析器SAX第33頁(yè)8.4.3 實(shí)體實(shí)體SAX解析器在遇到實(shí)體的時(shí)候會(huì)有以下幾種情解析器在遇到實(shí)體的時(shí)候會(huì)有以下幾種情況:況:u一般內(nèi)部實(shí)體 :首先將實(shí)體引用替換為實(shí)體內(nèi)容。然后再以文本數(shù)據(jù)事件報(bào)告給事件處理器,處理器調(diào)用characters

32、方法處理。 u一般外部實(shí)體 :首先將實(shí)體引用替換為實(shí)體的內(nèi)容,然后先向事件處理器報(bào)告一個(gè)實(shí)體事件,再報(bào)告一個(gè)文本數(shù)據(jù)事件,處理器先調(diào)用resolveEntity方法處理,然后再調(diào)用characters方法處理。 XML基礎(chǔ)教程第8章 XML解析器SAX第34頁(yè)8.4.3 實(shí)體實(shí)體u如果在XML文件中引用的實(shí)體在DTD中沒(méi)有相關(guān)的定義。解析器在遇到該實(shí)體的時(shí)候不會(huì)解析器該實(shí)體,并向事件處理器報(bào)告一個(gè)忽略實(shí)體事件,處理器調(diào)用skippedEntity方法處理。 u不可解析的實(shí)體:解析器會(huì)向事件處理器報(bào)告一個(gè)不可解析實(shí)體事件,處理器調(diào)用unparsedEntityDecl方法處理。 u如果XML文件

33、通過(guò)DOCTYPE聲明關(guān)聯(lián)外部DTD文件,則解析器在報(bào)告完文件開(kāi)始事件之后,會(huì)將DOCTYPE聲明作為實(shí)體事件報(bào)告給事件處理器。 XML基礎(chǔ)教程第8章 XML解析器SAX第35頁(yè)主要內(nèi)容主要內(nèi)容8.1 SAX簡(jiǎn)介簡(jiǎn)介8.2 SAX的特點(diǎn)的特點(diǎn) 8.3 SAX工作機(jī)制工作機(jī)制8.4 利用利用SAX解析解析XML8.5 SAX錯(cuò)誤信息錯(cuò)誤信息8.6 SAX與與DOM8.7 本章小結(jié)本章小結(jié) XML基礎(chǔ)教程第8章 XML解析器SAX8.5 SAX錯(cuò)誤信息錯(cuò)誤信息第36頁(yè)lSAX解析器默認(rèn)檢查解析器默認(rèn)檢查XML文件的規(guī)范性,要想讓文件的規(guī)范性,要想讓SAX解析也檢查解析也檢查XML文件的有效性,需要

34、在獲得文件的有效性,需要在獲得SAX解析器之前調(diào)用解析器之前調(diào)用SAXParserFactory對(duì)象的對(duì)象的setValidating方法設(shè)置方法設(shè)置。lSAX解析器在解析過(guò)程中發(fā)現(xiàn)解析器在解析過(guò)程中發(fā)現(xiàn)XML文件中存在錯(cuò)文件中存在錯(cuò)誤,就會(huì)向事件處理器報(bào)告一個(gè)錯(cuò)誤事件,錯(cuò)誤誤,就會(huì)向事件處理器報(bào)告一個(gè)錯(cuò)誤事件,錯(cuò)誤事件分為事件分為3個(gè)層次:警告(個(gè)層次:警告(warning)、一般錯(cuò)誤)、一般錯(cuò)誤(error)和致命錯(cuò)誤()和致命錯(cuò)誤(fatal error)。)。XML基礎(chǔ)教程第8章 XML解析器SAX8.5 SAX錯(cuò)誤信息錯(cuò)誤信息第37頁(yè)1.警告(警告(warning)XML1.0推薦標(biāo)

35、準(zhǔn)中,SAX中的警告不屬于規(guī)范性的錯(cuò)誤,解析器在認(rèn)為有必要報(bào)告警告時(shí),就會(huì)向事件處理器報(bào)告一個(gè)警告事件。處理器會(huì)調(diào)用下面的方法處理警告: void warning(SAXParseException e) 警告不屬于錯(cuò)誤或致命錯(cuò)誤的問(wèn)題,不會(huì)阻止解析器繼續(xù)解析。所以,對(duì)于警告可以不做任何處理,不必拋出SAXException異常。XML基礎(chǔ)教程第8章 XML解析器SAX第38頁(yè)2.一般錯(cuò)誤(一般錯(cuò)誤(error)當(dāng)XML內(nèi)容(而不是格式或結(jié)構(gòu))出現(xiàn)了意想不到的問(wèn)題就會(huì)報(bào)告一個(gè)一般錯(cuò)誤。例如,不滿(mǎn)足DTD文件中的某個(gè)約束。發(fā)生一般錯(cuò)誤時(shí),就表示被解析的文檔中的數(shù)據(jù)可能丟失、篡改或錯(cuò)誤等問(wèn)題。處理

36、器會(huì)調(diào)用下面的方法處理一般錯(cuò)誤: void error(SAXParseException e) 一般錯(cuò)誤不會(huì)影響解析器繼續(xù)解析,所以,處理一般錯(cuò)誤時(shí)一般不會(huì)拋出SAXException異常。8.5 SAX錯(cuò)誤信息錯(cuò)誤信息XML基礎(chǔ)教程第8章 XML解析器SAX第39頁(yè)3.致命錯(cuò)誤(致命錯(cuò)誤(fatal error)致命錯(cuò)誤是指絕對(duì)會(huì)干擾和阻止解析器繼續(xù)進(jìn)行解析的錯(cuò)誤。例如,解析不規(guī)范的XML文檔就會(huì)報(bào)告致命錯(cuò)誤。處理器會(huì)調(diào)用下面的方法處理致命錯(cuò)誤:void fatalError(SAXParseException e) 由于致命錯(cuò)誤將導(dǎo)致解析器無(wú)法繼續(xù)解析,所以,處理致命錯(cuò)誤時(shí)應(yīng)當(dāng)拋出SAXException異常,停止解析。如果不拋出SAXException異常,當(dāng)解析器無(wú)法繼續(xù)解析時(shí),就會(huì)強(qiáng)制拋出SAXException異常,停止解析。需要注意的是,前面3種方法中都含有一個(gè)參數(shù)e,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論