3.7 Java與XML聯(lián)合編程之SAX篇
SAX概念
SAX是Simple API for XML的縮寫,它并不是由W3C官方所提出的標準,可以說是“民間”的事實標準。實際上,它是一種社區(qū)性質(zhì)的討論產(chǎn)物。雖然如此,在XML中對SAX的應用絲毫不比DOM少,幾乎所有的XML解析器都會支持它。
與DOM比較而言,SAX是一種輕量型的方法。我們知道,在處理DOM的時候,我們需要讀入整個的XML文檔,然后在內(nèi)存中創(chuàng)建DOM樹,生成DOM樹上的每個Node對象。當文檔比較小的時候,這不會造成什么問題,但是一旦文檔大起來,處理DOM就會變得相當費時費力。特別是其對于內(nèi)存的需求,也將是成倍的增長,以至于在某些應用中使用DOM是一件很不劃算的事(比如在applet中)。這時候,一個較好的替代解決方法就是SAX。
SAX在概念上與DOM完全不同。首先,不同于DOM的文檔驅(qū)動,它是事件驅(qū)動的,也就是說,它并不需要讀入整個文檔,而文檔的讀入過程也就是SAX的解析過程。所謂事件驅(qū)動,是指一種基于回調(diào)(callback)機制的程序運行方法。(如果你對Java新的代理事件模型比較清楚的話,就會很容易理解這種機制了)
在XMLReader接受XML文檔,在讀入XML文檔的過程中就進行解析,也就是說讀入文檔的過程和解析的過程是同時進行的,這和DOM區(qū)別很大。解析開始之前,需要向XMLReader注冊一個ContentHandler,也就是相當于一個事件監(jiān)聽器,在ContentHandler中定義了很多方法,比如startDocument(),它定制了當在解析過程中,遇到文檔開始時應該處理的事情。當XMLReader讀到合適的內(nèi)容,就會拋出相應的事件,并把這個事件的處理權(quán)代理給ContentHandler,調(diào)用其相應的方法進行響應。
這樣泛泛的說來或許有些不容易理解,別急,后面的例子會讓你明白SAX的解析過程?纯催@個簡單XML文件:
Ogden Nash
Adam
當XMLReader讀到標簽時,就會調(diào)用ContentHandler.startElement()方法,并把標簽名POEM作為參數(shù)傳遞過去。在你實現(xiàn)的startElement()方法中需要做相應的動作,以處理當出現(xiàn)時應該做的事情。各個事件隨著解析的過程(也就是文檔讀入的過程)一個個順序的被拋出,相應的方法也會被順序的調(diào)用,最后,當解析完成,方法都被調(diào)用后,對文檔的處理也就完成了。下面的這個表,列出了在解析上面的那個XML文件的時候,順序被調(diào)用的方法:
遇到的項目 方法回調(diào)
{文檔開始} startDocument()
startElement(null,"POEM",null,{Attributes})
"\n" characters("\n...", 6, 1)
startElement(null,"AUTHOR",null,{Attributes})
"Ogden Nash" characters("\n...", 15, 10)
endElement(null,"AUTHOR",null)
"\n" characters("\n...", 34, 1)
endElement(null,"TITLE",null)
"\n" characters("\n...", 55, 1)
startElement(null,"LINE",null,{Attributes})
"Adam" characters("\n...", 62, 4)
endElement(null,"LINE",null)
"\n" characters("\n...", 67, 1)
endElement(null,"POEM",null)
{文檔結(jié)束} endDocument()
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |