?? 0801-0200.htm
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0071)http://162.105.170.55/ASPs/GetLearningArticleTemp.asp?section=0801-0200 -->
<HTML><HEAD><TITLE>XML中國(guó)論壇 - 初學(xué)進(jìn)階 - 8.1.2 DOM與SAX并存</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TABLE {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"
}
.pt9 {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"
}
.pt10 {
FONT-WEIGHT: 700; FONT-SIZE: 10pt; LINE-HEIGHT: 18pt; FONT-FAMILY: "宋體"
}
.TempOutline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; COLOR: #666666; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.TempOutline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; COLOR: #666666; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.Outline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.Outline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.Outline11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage0 {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage111 {
FONT-SIZE: 9pt; MARGIN-LEFT: 51pt; TEXT-INDENT: -64pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
</STYLE>
<META content="Microsoft FrontPage 5.0" name=GENERATOR></HEAD>
<BODY vLink=#000000 aLink=#000000 link=#000000 leftMargin=0 topMargin=0
onload=""><!-- 以下為主體內(nèi)容 -->
<div align="center">
<center>
<TABLE width="100%" border=0 style="border-collapse: collapse" bordercolor="#111111" cellpadding="0" cellspacing="0">
<TBODY>
<TR vAlign=top>
<TD width=43 rowSpan=2></TD>
<TD vAlign=center width="502" >
<p align="center"><IMG height=33
src="image/title_learner.gif" width=226></TD>
<TD width=41 rowSpan=2></TD>
</TR>
<TR vAlign=top>
<TD width="502" ><!-- 正文內(nèi)容 -->
<DIV class=pt10><B>8.1.2 DOM與SAX并存</B></DIV>
<DIV></DIV><BR>
<DIV class=pt9>
<P>如前所述,之所以要制定一個(gè)接口標(biāo)準(zhǔn),是為了給XML應(yīng)用程序的開發(fā)帶來(lái)方便,使得應(yīng)用程序可以根據(jù)需要隨時(shí)選擇、更換合適的分析器,同時(shí)又無(wú)須對(duì)程序本身再做大的改動(dòng)。那么讀者可能會(huì)問(wèn),既然接口需要統(tǒng)一,為什么現(xiàn)在還有兩個(gè)接口標(biāo)準(zhǔn)共存呢?這兩個(gè)標(biāo)準(zhǔn)之間又存在什么關(guān)系呢?</P>
<P>事實(shí)上,DOM和SAX兩個(gè)接口標(biāo)準(zhǔn)之所以能夠并存,就是因?yàn)樗鼈兯獙?shí)現(xiàn)的目標(biāo)不同。DOM和SAX分析器在接口實(shí)現(xiàn)過(guò)程中分別側(cè)重于不同的方面,二者各有長(zhǎng)短,分別滿足了不同的應(yīng)用需求。在進(jìn)行橫向比較之前,我們先來(lái)分別簡(jiǎn)要介紹一下這兩個(gè)標(biāo)準(zhǔn)。</P>
<P><STRONG>DOM</STRONG></P>
<P>DOM的全稱是Document Object
Model,也即文檔對(duì)象模型。在應(yīng)用程序中,基于DOM的XML分析器將一個(gè)XML文檔轉(zhuǎn)換成一個(gè)對(duì)象模型的集合(通常稱DOM樹),應(yīng)用程序正是通過(guò)對(duì)這個(gè)對(duì)象模型的操作,來(lái)實(shí)現(xiàn)對(duì)XML文檔數(shù)據(jù)的操作。通過(guò)DOM接口,應(yīng)用程序可以在任何時(shí)候訪問(wèn)XML文檔中的任何一部分?jǐn)?shù)據(jù),因此,這種利用DOM接口的機(jī)制也被稱作隨機(jī)訪問(wèn)機(jī)制。</P>
<P>DOM接口提供了一種通過(guò)分層對(duì)象模型來(lái)訪問(wèn)XML文檔信息的方式,這些分層對(duì)象模型依據(jù)XML的文檔結(jié)構(gòu)形成了一棵節(jié)點(diǎn)樹。無(wú)論XML文檔中所描述的是什么類型的信息,即便是制表數(shù)據(jù)、項(xiàng)目列表或一個(gè)文檔,利用DOM所生成的模型都是節(jié)點(diǎn)樹的形式。也就是說(shuō),DOM強(qiáng)制使用樹模型來(lái)訪問(wèn)XML文檔中的信息。由于XML本質(zhì)上就是一種分層結(jié)構(gòu),所以這種描述方法是相當(dāng)有效的。</P>
<P><STRONG>SAX</STRONG></P>
<P>SAX的全稱是Simple APIs for
XML,也即XML簡(jiǎn)單應(yīng)用程序接口。與DOM不同,SAX提供的訪問(wèn)模式是一種順序模式,這是一種快速讀寫XML數(shù)據(jù)的方式。當(dāng)使用SAX分析器對(duì)XML文檔進(jìn)行分析時(shí),會(huì)觸發(fā)一系列事件,并激活相應(yīng)的事件處理函數(shù),應(yīng)用程序通過(guò)這些事件處理函數(shù)實(shí)現(xiàn)對(duì)XML文檔的訪問(wèn),因而SAX接口也被稱作事件驅(qū)動(dòng)接口。</P>
<P> </P>
<P>DOM樹所提供的隨機(jī)訪問(wèn)方式給應(yīng)用程序的開發(fā)帶來(lái)了很大的靈活性,它可以任意地控制整個(gè)XML文檔中的內(nèi)容。然而,由于DOM分析器把整個(gè)XML文檔轉(zhuǎn)化成DOM樹放在了內(nèi)存中,因此,當(dāng)文檔比較大或者結(jié)構(gòu)比較復(fù)雜時(shí),對(duì)內(nèi)存的需求就比較高。而且,對(duì)于結(jié)構(gòu)復(fù)雜的樹的遍歷也是一項(xiàng)耗時(shí)的操作。所以,DOM分析器對(duì)機(jī)器性能的要求比較高,實(shí)現(xiàn)效率不十分理想。不過(guò),由于DOM分析器所采用的樹結(jié)構(gòu)的思想與XML文檔的結(jié)構(gòu)相吻合,同時(shí)鑒于隨機(jī)訪問(wèn)所帶來(lái)的方便,因此,DOM分析器還是有很廣泛的使用價(jià)值的。</P>
<P>SAX分析器在對(duì)XML文檔進(jìn)行分析時(shí),觸發(fā)了一系列的事件,由于事件觸發(fā)本身是有時(shí)序性的,因此,SAX提供的是一種順序訪問(wèn)機(jī)制,對(duì)于已經(jīng)分析過(guò)的部分,不能再倒回去重新處理。SAX之所以被叫做"簡(jiǎn)單"應(yīng)用程序接口,是因?yàn)镾AX分析器只做了一些簡(jiǎn)單的工作,大部分工作還要由應(yīng)用程序自己去做。也就是說(shuō),SAX分析器在實(shí)現(xiàn)時(shí),它只是順序地檢查XML文檔中的字節(jié)流,判斷當(dāng)前字節(jié)是XML語(yǔ)法中的哪一部分、是否符合XML語(yǔ)法,然后再觸發(fā)相應(yīng)的事件,而事件處理函數(shù)本身則要由應(yīng)用程序自己來(lái)實(shí)現(xiàn)。同DOM分析器相比,SAX分析器缺乏靈活性。然而,由于SAX分析器實(shí)現(xiàn)簡(jiǎn)單,對(duì)內(nèi)存要求比較低,因此實(shí)現(xiàn)效率比較高,對(duì)于那些只需要訪問(wèn)XML文檔中的數(shù)據(jù)而不對(duì)文檔進(jìn)行更改的應(yīng)用程序來(lái)說(shuō),SAX分析器更為合適。</P>
<P>綜上所述,無(wú)論是DOM接口還是SAX接口,都各自有其優(yōu)缺點(diǎn)。也正是如此,它們將長(zhǎng)期并存下去,在不同的應(yīng)用中發(fā)揮不同的作用。<BR></P></DIV>
<P></P>
<P></P></TD></TR></TBODY></TABLE>
</center>
</div>
<P></P>
<P>
<P></P></BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -