免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
XML認證教程,第 8 部分: SAX Parser
讀取和操縱 XML 文件的標(biāo)準方法是 DOM(“文檔對象模型”)。遺憾的是,這種方法需要讀取整個文件并將它存儲到樹結(jié)構(gòu)中,因而效率不高、緩慢,并且會過度使用資源。

什么是 SAX
讀取和操縱 XML 文件的標(biāo)準方法是 DOM(“文檔對象模型”)。遺憾的是,這種方法需要讀取整個文件并將它存儲到樹結(jié)構(gòu)中,因而效率不高、緩慢,并且會過度使用資源。

一種替代方法是使用 Simple API for XML 或 SAX。SAX 允許正在讀取文檔時處理該文檔,這避免了在采取操作之前需要等待存儲文檔的所有內(nèi)容。

SAX 是由 XML-DEV 郵件列表的成員開發(fā)的,Java 版本由 David Megginson 維護。他們的目的是提供一種更自然的方法來使用 XML,這種方法不會涉及到使用 DOM 的那種開銷。

結(jié)果是基于事件的 API。解析器將事件(譬如,元素的開始或結(jié)束)發(fā)送給處理信息的事件處理程序。然后,應(yīng)用程序自己可以處理數(shù)據(jù)。雖然原始文檔保持不變,但 SAX 提供了操縱數(shù)據(jù)的方法,然后會將該方法導(dǎo)向另一個過程或文檔。

對于 SAX,沒有官方的標(biāo)準;萬維網(wǎng)(W3C)或其它官方組織不維護 SAX,但在 XML 社區(qū)中,它是一個事實上的標(biāo)準。

SAX 處理是如何工作的
SAX 分析經(jīng)過其的 XML 流,這非常象老式的自動收報機紙條。考慮以下 XML 代碼片斷:

<?xml version="1.0"?><samples><server>UNIX</server><monitor>color</monitor></samples>

一般情況下,SAX 處理器分析這段代碼將生成以下事件:

Start documentStart element (samples)Characters (white space)Start element (server)Characters (UNIX)End element (server)Characters (white space)Start element (monitor)Characters (color)End element (monitor)Characters (white space)End element (samples)

SAX API 允許開發(fā)者捕獲這些事件,并對它們進行操作。

SAX 處理涉及以下幾步:

  1. 創(chuàng)建事件處理程序。
  2. 創(chuàng)建 SAX 解析器。
  3. 將事件處理程序分配給解析器。
  4. 對文檔進行解析,將每個事件發(fā)送給處理程序。

在SAX與DOM之間,如何選擇
選擇 DOM 還是 SAX,這取決于幾個因素:

  1. 應(yīng)用程序的目的:如果必須對數(shù)據(jù)進行更改,并且作為 XML 將它輸出,則在大多數(shù)情況下,使用 DOM。與使用 XSL 轉(zhuǎn)換來完成的簡單結(jié)構(gòu)更改不一樣,如果是對數(shù)據(jù)本身進行更改,則尤其應(yīng)該使用 DOM。
  2. 數(shù)據(jù)的數(shù)量:對于大文件,SAX 是更好的選擇。
  3. 將如何使用數(shù)據(jù):如果實際上只使用一小部分數(shù)據(jù),則使用 SAX 將數(shù)據(jù)抽取到應(yīng)用程序中,這種方法更好些。另一方面,如果知道將需要向后引用已經(jīng)處理過的信息,則 SAX 可能不是正確的選擇。
  4. 需要速度:通常,SAX 實現(xiàn)比 DOM 實現(xiàn)快。

記住 SAX 和 DOM 不是互斥的,這一點很重要??梢允褂?DOM 來創(chuàng)建事件的 SAX 流,可以使用 SAX 來創(chuàng)建 DOM 樹。事實上,大多數(shù)解析器實際常常使用 SAX 來創(chuàng)建 DOM 樹!

使用 JAXP 來創(chuàng)建解析器
接下來我們來看一下JAXP的SAX Parser是怎么樣工作的。

首先聲明 XMLReader xmlReader。然后使用 SAXParserFactory 來創(chuàng)建 SAXParser。正是 SAXParser 給您了 XMLReader。

import org.xml.sax.helpers.DefaultHandler;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.XMLReader;public class SurveyReader extends DefaultHandler{public SurveyReader() {}public static void main (String args[]) {XMLReader xmlReader = null;try {SAXParserFactory spfactory =SAXParserFactory.newInstance();spfactory.setValidating(false);	//設(shè)置驗證選項,如果您的XML文件是有效文檔的話,就不用驗證.這將提高處理速度SAXParser saxParser = spfactory.newSAXParser();xmlReader = saxParser.getXMLReader();} catch (Exception e) {System.err.println(e);System.exit(1);}}}

設(shè)置內(nèi)容處理程序
一旦創(chuàng)建了解析器,則需要將 SurveyReader 設(shè)置為內(nèi)容處理程序,以便于其接收事件。

xmlReader 的 setContentHandler() 方法完成這項工作。

...xmlReader = saxParser.getXMLReader();xmlReader.setContentHandler(new SurveyReader());} catch (Exception e) {...

當(dāng)然,對于內(nèi)容處理程序,這不是唯一的選項。

解析 InputSource
為了對文件進行實際地解析,需要 InputSource。這個 SAX 類封裝了所有將要處理的數(shù)據(jù),所以不必擔(dān)心它來自哪里。

現(xiàn)在,準備對文件進行實際解析。應(yīng)用程序?qū)⒎庋b在 InputSource 中的文件傳遞給 parse(),然后應(yīng)用程序會繼續(xù)運行。

...import org.xml.sax.InputSource;...xmlReader = saxParser.getXMLReader();xmlReader.setContentHandler(new SurveyReader());InputSource source = new InputSource("surveys.xml");xmlReader.parse(source);} catch (Exception e) {...

可以編譯和運行該程序,但這時應(yīng)該什么也沒有發(fā)生,因為應(yīng)用程序還沒有定義任何事件。

創(chuàng)建 ErrorHandler
當(dāng)然總會有可能在試圖進行解析時,數(shù)據(jù)有問題。在這樣的情況下,有一個處理程序來處理錯誤和內(nèi)容將是有幫助的。

就如同創(chuàng)建內(nèi)容處理程序一樣,可以創(chuàng)建出錯處理程序。通常,將作為 ErrorHandler 的單獨實例來創(chuàng)建它,但為了簡化該示例,出錯處理正是包含在 SurveyResults 中。由于該類繼承了 DefaultHandler 且沒有擴展 ContentHandler,所以這種雙重用法是可能的。

需要關(guān)注的事件有三個:警告、錯誤和致命錯誤。

...import org.xml.sax.SAXParseException;public class SurveyReader extends DefaultHandler{public SurveyReader() {}public void error (SAXParseException e) {System.out.println("Error parsing the file: "+e.getMessage());}public void warning (SAXParseException e) {System.out.println("Problem parsing the file: "+e.getMessage());}public void fatalError (SAXParseException e) {System.out.println("Error parsing the file: "+e.getMessage());System.out.println("Cannot continue.");System.exit(1);}}....xmlReader.setContentHandler(new SurveyReader());xmlReader.setErrorHandler(new SurveyReader());//設(shè)置 ErrorHandlerInputSource source = new InputSource("surveys.xml");....public static void main (String args[]) {...

SAX 事件
以下事件是常用的;它們都在 org.xml.sax 包的 HandlerBase 類中定義。

  1. startDocument 表示文檔開始。
  2. endDocument 表示文檔結(jié)束。
  3. startElement 表示元素開始。當(dāng)一對標(biāo)記中的起始標(biāo)記中的所有內(nèi)容被處理后,解析器 激發(fā)此事件。包括了標(biāo)記名和其屬性。
  4. endElement 表示元素結(jié)束。
  5. characters 包含字符數(shù)據(jù),類似于 DOM 的一個 Text 節(jié)點。

還有更多的 SAX 事件:

  1. ignorableWhitespace 此事件類似于我們前面所討論的無用 DOM 節(jié)點。它與 character 事件的區(qū)別,好處是:如果您不需要空格符,您可以通過忽略這個事件來忽略所有的空格符。
  2. warning、error 和 fatalError 這三個事件表示了解析錯誤。您可根據(jù)需要來響應(yīng)它們。
  3. setDocumentLocator 這個事件允許您存儲一個 SAX 的 Locator 對象。Locator 對象可以用來找出在文檔中確切發(fā)生事件的地方。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
常見的XML的兩種解析方法
XML文檔定義有幾種形式?它們之間有何本質(zhì)區(qū)別?解析XML文檔有哪幾種方式? - yaki...
Android讀寫XML(中)——SAX
Android實現(xiàn)XML解析技術(shù)
Android提高第七篇之XML解析與生成
幾個解析XML的例子
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服