<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    SAX Parser

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

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

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

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

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

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

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

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

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

    
    Start document
    Start 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ā)者捕獲這些事件,并對它們進(jìn)行操作。

    SAX 處理涉及以下幾步:

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

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

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

    記住 SAX 和 DOM 不是互斥的,這一點(diǎn)很重要。可以使用 DOM 來創(chuàng)建事件的 SAX 流,可以使用 SAX 來創(chuàng)建 DOM 樹。事實(shí)上,大多數(shù)解析器實(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è)置驗(yàn)證選項,
    如果您的XML文件是有效文檔的話,
    就不用驗(yàn)證.這將提高處理速度
    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
    為了對文件進(jìn)行實(shí)際地解析,需要 InputSource。這個 SAX 類封裝了所有將要處理的數(shù)據(jù),所以不必?fù)?dān)心它來自哪里。

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

    
    ...
    
    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ùn)行該程序,但這時應(yīng)該什么也沒有發(fā)生,因?yàn)閼?yīng)用程序還沒有定義任何事件。

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

    就如同創(chuàng)建內(nèi)容處理程序一樣,可以創(chuàng)建出錯處理程序。通常,將作為 ErrorHandler 的單獨(dú)實(shí)例來創(chuàng)建它,但為了簡化該示例,出錯處理正是包含在 SurveyResults 中。由于該類繼承了 DefaultHandler 且沒有擴(kuò)展 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è)置 ErrorHandler
    
    InputSource 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é)點(diǎn)。

    還有更多的 SAX 事件:

    1. ignorableWhitespace 此事件類似于我們前面所討論的無用 DOM 節(jié)點(diǎn)。它與 character 事件的區(qū)別,好處是:如果您不需要空格符,您可以通過忽略這個事件來忽略所有的空格符。
    2. warning、error 和 fatalError 這三個事件表示了解析錯誤。您可根據(jù)需要來響應(yīng)它們。
    3. setDocumentLocator 這個事件允許您存儲一個 SAX 的 Locator 對象。Locator 對象可以用來找出在文檔中確切發(fā)生事件的地方。

    轉(zhuǎn)自:http://www-128.ibm.com/developerworks/cn/xml/x-cert/part8/

    posted on 2005-04-24 10:04 weidagang2046 閱讀(4298) 評論(0)  編輯  收藏 所屬分類: XML


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: a级毛片毛片免费观看久潮喷| 国产自偷亚洲精品页65页| 麻豆精品不卡国产免费看| 国产亚洲综合一区二区三区| 亚洲第一成年人网站| 人人狠狠综合久久亚洲88| 全部免费国产潢色一级| 免费无码A片一区二三区| 日韩午夜理论免费TV影院| 国产精品免费一区二区三区| 羞羞漫画在线成人漫画阅读免费| 亚洲另类古典武侠| 婷婷亚洲综合五月天小说| 亚洲日韩在线观看免费视频| 在线观看亚洲免费| 拨牐拨牐x8免费| 青草草色A免费观看在线| 99免费观看视频| 伊人久久免费视频| 国产99视频精品免费专区| 久99久无码精品视频免费播放| 国产精品亚洲一区二区三区久久| 中中文字幕亚洲无线码| 久久精品国产亚洲AV久| 亚洲国产精品综合久久2007| 中文字幕亚洲免费无线观看日本| 亚洲AV无码成人精品区天堂| 国产亚洲精品影视在线产品| 亚洲精品97久久中文字幕无码| 免费在线观看a级毛片| 亚洲AV伊人久久青青草原 | 亚洲精品91在线| 亚洲av日韩av不卡在线观看| 精品国产亚洲一区二区三区| 亚洲欧洲国产精品香蕉网| 亚洲婷婷五月综合狠狠爱| 日韩亚洲人成在线综合日本| 亚洲国产成人片在线观看| 久久久久亚洲av无码尤物| 久久亚洲私人国产精品vA| 久久久亚洲裙底偷窥综合|