版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、SAX,使用SAX來解析XML;如何使用SAX來檢索、操作、輸出XML;,在采用DOM之后性能受到嚴(yán)重影響的情況下,使用SimpleAPIforXML(SAX)。在用DOM耗費(fèi)較長時間解析XML文件以后,你可能注意到在用DOM處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結(jié)構(gòu)所造成的:這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存,XML解析器,XML程序的結(jié)構(gòu),XML程序由兩部分組成:解析器:用于處理XML文檔;應(yīng)用程序:通過解析器對文件內(nèi)容進(jìn)行操作;,XML文檔,解析器,應(yīng)用程序,編程接口,基于對象的API,基于事件的API,基于對象的接口和基于事件的接
2、口,DOM通過在內(nèi)存中明確地建立一棵對象樹來和應(yīng)用程序進(jìn)行交互。DOM方法涉及讀取整個文件并將該文件存儲在一個樹結(jié)構(gòu)中,而這樣可能是低效的、緩慢的,并且很消耗資源。,SAX用于操作XML的、輕量級的、基于事件的API。SAX是由XML-DEV郵件列表的成員開發(fā)的。解析器向一個事件處理程序發(fā)送事件,比如元素開始和元素結(jié)束,而事件處理器則處理該信息。然后應(yīng)用程序本身就能夠處理該數(shù)據(jù)。原始的文檔仍然保留完好無損,SAX提供了操作數(shù)據(jù)的手段。,需要安裝的工具:文本編輯器;JavaTM2SDK,StandardEdition1.4x版;DOM支持已內(nèi)置到最新版本的Java技術(shù)中。(ApacheXerce
3、s-Java或SUNJavaAPIforXML)其他語言C+,Perl等;,一、SAX處理是如何工作的,SAX在讀取XML流的同時進(jìn)行處理。,考慮下面的XML代碼片斷:UNIXcolor,分析這個代碼片斷的SAX處理器一般情況下將產(chǎn)生以下事件:StartdocumentStartelement(samples)Characters(whitespace)Startelement(server)Characters(UNIX)Endelement(server)Characters(whitespace)Startelement(monitor)Characters(color)Endeleme
4、nt(monitor)Characters(whitespace)Endelement(samples),SAXAPI允許開發(fā)人員捕捉這些事件并對它們作出反應(yīng)。,一、SAX處理是如何工作的,基于事件的處理的優(yōu)點和缺點:優(yōu)點:分析能夠立即開始,而不是等待所有的數(shù)據(jù)被處理;應(yīng)用程序只是在讀取數(shù)據(jù)時檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲在內(nèi)存中;事實上,應(yīng)用程序甚至不必解析整個文檔,它可以在某個條件得到滿足時停止解析;一般來說,SAX還比它的替代者DOM快許多;解析文檔,同時向事件處理程序發(fā)送每個事件;缺點:由于應(yīng)用程序沒有以任何方式存儲數(shù)據(jù),使用SAX來更改數(shù)據(jù)或在數(shù)據(jù)流中往后移是不可能的。,基于樹的處理
5、的優(yōu)點和缺點:優(yōu)點:由于樹在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對數(shù)據(jù)和結(jié)構(gòu)作出更改;可以在任何時候在樹中上下導(dǎo)航,而不是像SAX那樣是一次性的處理;DOM使用起來也要簡單得多;缺點:在內(nèi)存中構(gòu)造這樣的樹涉及大量的開銷,大型文件完全占用系統(tǒng)內(nèi)存容量的情況并不少見;創(chuàng)建一棵DOM樹可能是一個緩慢的過程;,一、SAX處理是如何工作的,一、SAX處理是如何工作的,如何在SAX和DOM之間選擇:應(yīng)用程序的目的若對數(shù)據(jù)作出更改并將它輸出為XML,那么DOM是適當(dāng)?shù)倪x擇,但不是說使用SAX不能更改數(shù)據(jù),只是該過程要復(fù)雜得多;數(shù)據(jù)容量對于大型文件,SAX是更好的選擇;數(shù)據(jù)將如何使用如果只有數(shù)據(jù)中的少
6、量部分會被使用,那么使用SAX來將該部分?jǐn)?shù)據(jù)提取到應(yīng)用程序中可能更好;對速度的需要SAX實現(xiàn)通常要比DOM實現(xiàn)更快;,SAX和DOM不是相互排斥的!可以使用DOM來創(chuàng)建SAX事件流,也可以使用SAX來創(chuàng)建DOM樹。,一、SAX處理是如何工作的,兩種方法,XML文檔,XML解析程序,DOM,應(yīng)用程序,分析,獲取信息,XML文檔,XML解析程序,應(yīng)用程序,事件處理器,分析,信息,一、SAX處理是如何工作的,答案將存儲在一個XML文件中:,ABADBCAADA,一、SAX處理是如何工作的,ABADB,瞧!一條處理指令,嗨,找到了survey元素的開始,一、SAX處理是如何工作的,survey元素的結(jié)
7、束,SAX解析器對XML文檔的處理,找到啦,SAX解析的過程就是產(chǎn)生事件的過程,一、SAX處理是如何工作的,在SAX的解析過程中,SAX解析器比DOM做更少的工作,這樣將更多的程序控制權(quán)交給開發(fā)人員。(SAX比較低級),XML文檔,XML解析程序,應(yīng)用程序,事件處理器,分析,信息,SAX解析器的處理過程是不可逆的,產(chǎn)生一個事件后就會忘掉,應(yīng)用程序必須明確地將它感興趣的事件接收并緩存起來。,一、SAX處理是如何工作的,SAX的不足之處,不是一個易于掌握的、直觀的API;不允許你控制數(shù)據(jù)提供給應(yīng)用程序的順序;因為沒有完整的內(nèi)存映像,所以沒有簡單的方法將文檔再寫回到XML中。若從XML轉(zhuǎn)換到XML,
8、必須自己完成格式化的操作。,一、SAX處理是如何工作的,SAX的簡短歷史,SAX不屬于任何公司、組織,存在是因為它的簡單而有效。XML-DEV郵件列表(目前由OASIS控制)作用:解決不同的XML語法分析程序之間的兼容性。DavidMegginson承擔(dān)SAX規(guī)范的任務(wù)SAX1.01998年5月11日SAX2.02000年5月5日語言的支持SAX最初是為Java定義的;Python,Perl,C+,常用SAX解析器,XercesApacheMSXMLMircosoftXDKOracle以上的解析器既支持DOM,又支持SAX。,XPJamesCla
9、rk()以上的解析器僅提供對SAX的支持。,二、創(chuàng)建SAX解析器,SAX處理涉及以下步驟:創(chuàng)建一個事件處理程序;創(chuàng)建SAX解析器;向解析器分配事件處理程序;解析文檔,同時向事件處理程序發(fā)送每個事件;,二、創(chuàng)建SAX解析器,二、創(chuàng)建SAX解析器,創(chuàng)建事件處理程序,(如何接收SAX事件),SAX是一個事件驅(qū)動的接口,如何捕獲這些事件呢?,原理:寫一個Java類,實現(xiàn)一個SAX接口,傳遞這個接口類的實例參數(shù)給語法分析程序,則語法分析程序可以跟事件處理器進(jìn)行交流。,方法:聲明一個類,可以指定一個類實現(xiàn)的接口。publicclassMyClassimplementsContentHandlerConte
10、ntHandler是它所實現(xiàn)的接口的名稱,它是SAX中最重要的接口,“通知發(fā)生了什么事情”,標(biāo)準(zhǔn)的默認(rèn)實現(xiàn):DefaultHandler接口可使用替代方法:extendsDefaultHandler,(太多的方法),二、創(chuàng)建SAX解析器,創(chuàng)建事件處理程序,標(biāo)準(zhǔn)的默認(rèn)實現(xiàn):DefaultHandler接口可使用替代方法:extendsDefaultHandler即publicclassMyClasssextendsDefaultHandler,DefaultHandler中有很多方法,我們可以使用其中的方法也可以重載。,二、創(chuàng)建SAX解析器,基本的應(yīng)用程序,功能:初始化語法分析程序,捕獲用于通知
11、文檔開始和結(jié)束的事件。Exampled:javasaxSAXTransform1.java使用JAXP的標(biāo)準(zhǔn)方法來創(chuàng)建解析器,主要獲取XMLReader對象,它用來通知SAX,將調(diào)用哪個對象的方法來處理SAX事件。,事件處理程序接受解析器提供的參數(shù)。,二、創(chuàng)建SAX解析器,獲取XMLReader對象的方法,XMLParserFactoryxpf=XMLParserFactory.newInstance();XMLParserxp=xpf.newXMLParser();XMLReaderxreader=xp.getXMLReader();,XMLReaderxreader=XMLReaderFa
12、ctory.createXMLReader(org.apache.xerces.parsers.SAXParser),獲得XMLReader對象后要,設(shè)置ContentHandler,參數(shù)是當(dāng)前類的對象。,參數(shù)是解析器的類名可以不設(shè)置參數(shù),二、創(chuàng)建SAX解析器,對解析器的設(shè)定,XMLParserFactoryxpf=XMLParserFactory.newInstance();xpf.setValidating(false);/非驗證xpf.setFeature(/sax/features/namespaces,true);/對名稱空間處理,Exampled:java
13、saxTransform1.java(1)修改設(shè)置,看localName的結(jié)果;(2)namespaceURI是URI,不是prefix,二、創(chuàng)建SAX解析器,ContentHandler中的事件,startDocument()/endDocument()startElement()/endElement()屬性作為一個Attributes參數(shù)被傳遞空元素也將產(chǎn)生startElement()和endElement()startPrefixMapping()/endPrefixMapping()向應(yīng)用程序通知名稱空間作用域(setFeature()時)characters()/ignorable
14、Whitespace()找到文本時通知應(yīng)用程序ignorableWhitespace()表示由XML標(biāo)準(zhǔn)定一忽略的空格processingInstruction()通知處理指令skippedEntity()通知忽略了一個實體(DTD中/Schema中)setDocumentLocator()向應(yīng)用程序傳遞一個Locator對象,二、創(chuàng)建SAX解析器,Attributes,應(yīng)用程序在startElement()事件中,通過Attributes參數(shù)得到屬性列表。Attributes定義了下列方法:,getValue(i)/getValue(qName)/getValue(uri,localName
15、)返回第i個屬性得值或給出名字的相應(yīng)屬性的值getLength()返回屬性的數(shù)目getQName(i)/getLocalName(i)/getURI(i)返回第I個屬性的合格名稱(帶有前綴/本地名稱/名稱空間)getType(i)/getType(qName)/getType(uri,localName)返回第I個屬性的類型。類型為字符串。,屬性的名稱空間,All,startElement(),二、創(chuàng)建SAX解析器,解析器實際上傳遞每個元素的多個信息:限定名稱,或qName。這實際上是名稱空間信息(如果有的話)和元素的實際名稱的組合。如果有的話,qName還包括冒號(:)例如:revised:
16、response。名稱空間URI。實際的名稱空間是某種形式的URI,而不是被添加到元素或?qū)傩悦Q的別名。例如:/surveys/而不是簡單的revised。本地名稱。這是元素的實際名稱,比如question。如果文檔沒有提供名稱空間信息,解析器也許不能確定qName的哪個部分是localName。任何屬性。元素的屬性實際上是作為對象的集合來傳遞的。,ExampleTransform1.java,二、創(chuàng)建SAX解析器,ErrorHandler(),定義了與錯誤相關(guān)的事件,應(yīng)用程序能夠提供自定義的錯誤處理。ErrorHandler()定義了三個方法:warning
17、()不是XML規(guī)范定義的錯誤;error()出現(xiàn)XML規(guī)范定義的錯誤;fatalError()出現(xiàn)了XML規(guī)范定義的致命錯誤;,ExampleTransform1.java,processingInstruction(),二、創(chuàng)建SAX解析器,DTDHandler(),聲明與DTD有關(guān)的兩個事件:notationDecl()當(dāng)符號已經(jīng)被聲明時向應(yīng)用程序發(fā)出通知。unparseEntityDecl()當(dāng)找到未解析的實體聲明時向應(yīng)用程序發(fā)出通知。,EntityResolver()返回一個InputSource,SAXException()表示解析XML文檔過程中出現(xiàn)的錯誤。,二、創(chuàng)建SAX解析器,characters()當(dāng)語法分析程序在元素中找到某些字符數(shù)據(jù)的時候,觸發(fā)這個方法。publicvoidcharacters(charchars,intstar
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 18570.9-2025涂覆涂料前鋼材表面處理表面清潔度的評定試驗第9部分:水溶性鹽的現(xiàn)場電導(dǎo)率測定法
- GB/T 46018.2-2025塑料再生塑料產(chǎn)品評價技術(shù)規(guī)范第2部分:聚苯乙烯(PS)材料
- 學(xué)校健康素養(yǎng)試題及答案
- 會計面試常被問的問題及答案試題
- 安全員考試模擬試題及參考答案詳解
- 水務(wù)行業(yè)面試題及答案
- 拉薩市曲水縣輔警招聘公安基礎(chǔ)知識考試題庫及答案
- 股票知識考試文案及答案
- 刨花板鋪裝工入職考核試卷及答案
- 血液透析室血液凈化理論考試試題與答案
- 云南省玉溪市2025-2026學(xué)年八年級上學(xué)期1月期末物理試題(原卷版+解析版)
- 2026年哈爾濱通河縣第一批公益性崗位招聘62人考試參考試題及答案解析
- 六年級寒假家長會課件
- 就業(yè)協(xié)議書解約函模板
- DL-T976-2017帶電作業(yè)工具、裝置和設(shè)備預(yù)防性試驗規(guī)程
- 光學(xué)下擺拋光技術(shù)培訓(xùn)教材
- 建筑材料進(jìn)場報告
- YY/T 1543-2017鼻氧管
- YS/T 903.1-2013銦廢料化學(xué)分析方法第1部分:銦量的測定EDTA滴定法
- GB/T 9414.9-2017維修性第9部分:維修和維修保障
- GB/T 21781-2008化學(xué)品的熔點及熔融范圍試驗方法毛細(xì)管法
評論
0/150
提交評論