系統(tǒng)分析員考試復(fù)習(xí)部分(2)

字號(hào):

和CORBA、DCOM這些技術(shù)并不沖突:XML可以為它們做傳遞信息、資料橋梁;XML使用方便;XML是純文本形式,閱讀方便,可用編輯器直接編寫(xiě),可以直接透過(guò)HTTP或SMTP等通信協(xié)議傳送,開(kāi)放式標(biāo)準(zhǔn),對(duì)數(shù)據(jù)的描述,有有進(jìn)行數(shù)據(jù)挖掘,編排的便利。但是處理速度較慢。
    SAX (Simple API for XML) 和 DOM (Document Object Model) 都是為了讓程序員不用寫(xiě)一個(gè)解析器就可以訪問(wèn)他們的資料信息。通過(guò)利用XML 1.0格式保存信息,以及使用SAX或者DOM APIs你的程序可以使用任何解析器。這是因?yàn)槭褂盟麄兯矏?ài)的語(yǔ)言開(kāi)發(fā)解析器的開(kāi)發(fā)者必須實(shí)現(xiàn)SAX和DOM APIs。 SAX和DOM APIs 對(duì)多種語(yǔ)言中都可以實(shí)現(xiàn)(Java, C++, Perl, Python, 其它...)。
    所以SAX 和 DOM都是為了同樣的目的而存在,這就是使用戶可以利用任何編程語(yǔ)言訪問(wèn)存入XML文檔中的信息(要有一個(gè)那種編程語(yǔ)言的解析器)。雖然他們?cè)谔峁┙o你訪問(wèn)信息的方法上大不相同。
    什么是DOM?
     DOM 可以讓你以分層次對(duì)象模型來(lái)訪問(wèn)儲(chǔ)存在XML文檔中的信息。DOM生成一棵節(jié)點(diǎn)樹(shù)(以XML文檔的結(jié)構(gòu)和信息為基礎(chǔ))你可以通過(guò)這棵樹(shù)來(lái)訪問(wèn)你的信息。在XML文檔中的文本信息轉(zhuǎn)變成一組樹(shù)的節(jié)點(diǎn)。
    你的XML文檔中的信息的類型 (不管是表格數(shù)據(jù),或是一列items,或者只是文檔), DOM在你創(chuàng)建一個(gè)XML文檔的文檔對(duì)象時(shí)創(chuàng)建一棵節(jié)點(diǎn)樹(shù)。 DOM強(qiáng)迫你使用樹(shù)狀模型(就像 Swing TreeModel)去訪問(wèn)你的XML文檔中的信息。這種模式確實(shí)不錯(cuò)因?yàn)閄ML原本就是分層次的。這也是DOM為什么可以把你的信息放到一棵樹(shù)中的原因(即使信息是表格式的或者簡(jiǎn)單的列表????這里不知道該怎么翻原文是:even if the information is actually tabular or a simple list??????)。
    上圖是過(guò)分簡(jiǎn)單的,因?yàn)樵贒OM中,每一個(gè)元素節(jié)點(diǎn)實(shí)際上都有一系列的其他節(jié)點(diǎn)作為它的孩子。這些孩子節(jié)點(diǎn)可以包含文本值或者是其他元素節(jié)點(diǎn)。乍看起來(lái),通過(guò)遍歷訪問(wèn)一個(gè)元素的所有孩子節(jié)點(diǎn)來(lái)訪問(wèn)這個(gè)節(jié)點(diǎn)的值是沒(méi)有必要的(舉例來(lái)說(shuō):節(jié)點(diǎn) " Nazmul ", Nazmul是值)。如果每個(gè)元素只有值的話,這確實(shí)是沒(méi)有必要的。但是,元素可能含有文本數(shù)據(jù)或者其他元素;這是你要在DOM中做額外的工作來(lái)獲取元素節(jié)點(diǎn)值的原因。通常當(dāng)你的文檔中只有純數(shù)據(jù)時(shí),把所有的數(shù)據(jù)壓成一個(gè)“塊“放到字串中并讓DOM把那個(gè)字串當(dāng)成某個(gè)特定元素節(jié)點(diǎn)的值返回是適當(dāng)?shù)?。這種方式并不適合如果在你的XML文檔中的數(shù)據(jù)是個(gè)文檔(比如像WORD文檔或者FRAMEMAKER文檔)在文檔中,元素的順序是非常重要的。對(duì)于純數(shù)據(jù)(像一個(gè)數(shù)據(jù)庫(kù)表)元素的順序是不要緊的。 之所以DOM保持從XML文檔中讀出的元素的順序,因?yàn)樗阉械氖挛锒籍?dāng)成文檔來(lái)處理。文檔對(duì)像模型的叫法由此而來(lái)。
    如果你計(jì)劃用DOM做為JAVA對(duì)象模型用于你存儲(chǔ)在XML文檔中的信息,那么你不需要考慮SAX??墒侨绻惆l(fā)現(xiàn)DOM不是一個(gè)可以用于處理XML文檔信息的好的對(duì)象模式,那么你可能想看看SAX了。在一些必須使用自定義對(duì)象模型的案例中使用SAX是非常普遍的。說(shuō)一句讓事情看來(lái)有些糊涂的話,你也可以在DOM的基礎(chǔ)之上創(chuàng)建自己的對(duì)象模式。面向?qū)ο笳媸莻€(gè)好東東。
    什么是SAX?
    SAX讓你訪問(wèn)儲(chǔ)存在XML文檔中的信息,不是通過(guò)節(jié)點(diǎn)樹(shù),而是一系列的事件。你會(huì)問(wèn),這有什么益處?回答是,SAX選擇不在XML文檔上創(chuàng)建JAVA對(duì)象模型(像DOM做的那樣)。這樣使得SAX更快, 同時(shí)使下面所述成為必要:
    創(chuàng)立你自己的自定義對(duì)像模型
    創(chuàng)建一個(gè)監(jiān)聽(tīng)SAX事件的類同時(shí),創(chuàng)建你自己的對(duì)象模型。注意這些步驟對(duì)DOM而言是不必要的,因?yàn)镈OM已經(jīng)為你創(chuàng)建了一個(gè)對(duì)象模型(將你的信息用一棵節(jié)點(diǎn)樹(shù)表示)。
    在使用DOM的情況下,解析器做了絕大多數(shù)事情, 讀入XML文檔, 在這基礎(chǔ)之上創(chuàng)建JAVA對(duì)象模型,然后給你一個(gè)對(duì)這個(gè)對(duì)象的引用(一個(gè) Document對(duì)象),因而你可以操作使用它。SAX被叫做Simple API for XML不是沒(méi)有原因的, 她真的很簡(jiǎn)單。 SAX沒(méi)有期待解析器去做這么多工作,所有SAX 要求的是解析器應(yīng)該讀入XML文檔,同時(shí)根據(jù)所遇到的XML文檔的標(biāo)簽發(fā)出一系列事件。你要自己寫(xiě)一個(gè)XML文檔處理器類(XML document handler class)來(lái)處理這些事件,這意味著使所有標(biāo)簽事件有意義還有用你自己的對(duì)象模型創(chuàng)建對(duì)象。所以你要完成:
    控制所有XML文檔信息的自定義對(duì)象模型(或者源文檔在這里的寫(xiě)法從來(lái)沒(méi)有見(jiàn)過(guò),或者懷疑源文檔在這里有排版錯(cuò)誤,先這么翻了)一個(gè)監(jiān)聽(tīng)SAX事件(事件由SAX解析器讀取你的XML文檔時(shí)產(chǎn)生)的文檔處理器,還有解釋這些事件創(chuàng)建你自定義對(duì)象模型中的對(duì)象如果你的對(duì)象模型簡(jiǎn)單的話那么SAX在運(yùn)行時(shí)會(huì)非???。在這種情況下,它會(huì)比DOM快,因?yàn)樗雎粤藶槟愕男畔?chuàng)建一個(gè)樹(shù)形對(duì)象模型的過(guò)程。從另一方面來(lái)說(shuō),你必須寫(xiě)一個(gè)SAX 文檔處理器來(lái)解釋所有的SAX事件(這會(huì)是一件很繁重的工作)。
    什么類型的SAX事件被SAX解析器拋出了哪? 這些事件實(shí)際上是非常簡(jiǎn)單的。SAX會(huì)對(duì)每一個(gè)開(kāi)始標(biāo)簽拋出事件,對(duì)每一個(gè)結(jié)束標(biāo)簽也是如此。它對(duì)#PCDATA和 CDATA 部分同樣拋出事件。你的文檔處理器 (對(duì)這些事件的監(jiān)聽(tīng)器)要解釋這些事件同時(shí)還要在他們基礎(chǔ)之上創(chuàng)建你自定義的對(duì)象模型。你的文檔處理器必須對(duì)這些事件做出解釋,同時(shí)這些事件發(fā)生的順序是非常重要的。SAX同時(shí)也對(duì)processing instructions, DTDs, comments, 拋出事件. 但是它們?cè)诟拍钌鲜且粯拥? 你的解析器要解釋這些事件(還有這些事件的發(fā)生順序)以及使他們有意義。
    什么時(shí)候使用DOM
    如果你的XML文檔包含文檔數(shù)據(jù)(例如, Framemaker documents stored in XML format), 那么DOM就是你的解決方案的最自然選擇。如果你要?jiǎng)?chuàng)建一些類似于文檔信息管理的系統(tǒng),那么你不得不處理大量的文檔數(shù)據(jù)。Datachannel RIO 產(chǎn)品就是這么一個(gè)例子,它可以索引和組織各種類型文檔資源中的信息(例如Word和Excel 文件)。在這種情況下,DOM是非常合適程序去訪問(wèn)存貯在這些文檔中的信息的。
    然而,如果你主要處理的是結(jié)構(gòu)化的數(shù)據(jù)(在XML中的序列化的JAVA對(duì)象the equivalent of serialized Java objects in XML),DOM不是的選擇。那就是SAX會(huì)比較合適的地方。
    什么時(shí)候使用SAX
    如果在你XML文檔中的信息是機(jī)器易讀的(和機(jī)器生成的)數(shù)據(jù),那么SAX是讓你可以訪問(wèn)這些信息的合適的API。機(jī)器易讀和生成的數(shù)據(jù)類型包含像下面這些東東:
    存成XML格式的Java對(duì)象屬性用一些以文本為基礎(chǔ)的查詢語(yǔ)句(SQL, XQL, OQL)表示的查詢由查詢生成的結(jié)果集(這也許包含關(guān)系型數(shù)據(jù)庫(kù)表中的數(shù)據(jù)編碼成XML).這么看來(lái)機(jī)器生成的數(shù)據(jù)是你一般要在java中生成數(shù)據(jù)結(jié)構(gòu)和類的信息。一個(gè)簡(jiǎn)單的例子是包含個(gè)人信息的地址簿,在上圖所示。這個(gè)地址簿xml文件不像字處理器文檔,它是一個(gè)包含已經(jīng)被編碼成文本的純數(shù)據(jù)的XML文檔。
    當(dāng)你的數(shù)據(jù)是這種樣式,你要?jiǎng)?chuàng)建你自己的數(shù)據(jù)結(jié)構(gòu)和類(對(duì)象模型)來(lái)管理操作以及持續(xù)保存這些數(shù)據(jù)。SAX容許你快速創(chuàng)建一個(gè)可以生成你的對(duì)象模型實(shí)例的處理器類。一個(gè)實(shí)例是:一個(gè)SAX文檔處理器。它完成的工作有讀入包含我的地址薄信息的XML文檔,創(chuàng)建一個(gè)可以訪問(wèn)到這些信息的AddressBook類。SAX指南告訴你該怎么做到這些。這個(gè)地址薄XML文檔包含person元素,person元素中有name和email元素。我的AddressBook對(duì)象模型包括下面的類:
    AddressBook 類,Person對(duì)象的容器Person 類,String 型的name和email的容器這樣我的“SAX 地址簿文檔處理器”可以把person元素轉(zhuǎn)變成Person對(duì)象了,然后把它們都存入AddressBook對(duì)象。這個(gè)文檔處理器將name和email元素轉(zhuǎn)變?yōu)镾tring對(duì)象。
    結(jié)論
    你寫(xiě)的SAX文檔處理器(SAX document handler)做了將元素映射為對(duì)象的工作。如果你的信息被結(jié)構(gòu)化成可以容易創(chuàng)建這樣的映射,你應(yīng)該使用SAX API。從另一方面來(lái)說(shuō),如果你的數(shù)據(jù)更適宜用樹(shù)來(lái)表示那么你應(yīng)該使用DOM。
    XML在ASP中用DOM:
    

Scripting News Headlines


    <%
    dim i
    Set objXml = Server.CreateObject("MSXML2.DOMDocument")
    objXML.async = False
    objXML.Load(Server.MapPath("student4.xml"))
    Set objNodeList = objXML.getElementsByTagName("教師[姓名='江建軍']")
    nubmer=objXML.getElementsByTagName("教師[姓名='江建軍']").item(0).childNodes.length
    Response.Write(nubmer)
    Response.Write("
")
    Response.Write("")
    Response.Write("")
    for i=1 to number
     Response.Write("
")
     Response.Write("")
    next
    Response.Write("
姓名"+objNodeList(0).childNodes(i).Text+"姓名"+objNodeList(0).childNodes(i).Text+"
")
    %>
    
    <%
    %>
    
    HTML的缺點(diǎn):
    ① 鏈接丟失后不能自動(dòng)糾正;
    ② 動(dòng)態(tài)內(nèi)容需要下載的部件太多;
    ③ 搜索時(shí)間長(zhǎng);
    ④ HTML缺乏對(duì)雙字節(jié)或多國(guó)文字的支持,或者說(shuō)支持不夠;
    HTML可擴(kuò)展性差。