1、 XML 簡(jiǎn)介 XML(Xtensible Markup Language,即擴(kuò)展標(biāo)記語(yǔ)言)的發(fā)展起源于1996年。當(dāng)時(shí),出版界巨頭和Web業(yè)內(nèi)人士經(jīng)過(guò)共同討論,提出了創(chuàng)建SGML(Standard Generalized Markup Language,即標(biāo)準(zhǔn)通用標(biāo)識(shí)語(yǔ)言)子集(HML)的建議。該子集專用于Web,具有可擴(kuò)展(或可擴(kuò)充)性,并且能利用結(jié)構(gòu)化標(biāo)記語(yǔ)言的所有高級(jí)功 能,但摒棄了SGML的復(fù)雜性。XML規(guī)范的第一份草稿于1996年11月發(fā)布后不久,1997年1月首個(gè)XML解析器就面世了。隨后,便出現(xiàn)了XML的 應(yīng)用以及新的規(guī)范和解析器。 HTML(Hypertext Markup Language)語(yǔ)言是大家所熟悉的開發(fā)網(wǎng)頁(yè)的一種標(biāo)記語(yǔ)言,但它不是一種編程語(yǔ)言,它的主要標(biāo)記是針對(duì)文檔內(nèi)容本身結(jié)構(gòu)的描述,因機(jī)器本身是不能夠解 析它的內(nèi)容的。XML語(yǔ)言是SGML語(yǔ)言的子集,它保留了SGML主要的使用功能,同時(shí)大大減小了SGML的復(fù)雜性。它不僅能表示文檔的內(nèi)容,而且可以表 示文檔的結(jié)構(gòu),這樣在能夠被人類理解的同時(shí),也能夠被機(jī)器所理解。雖然HTML是SGML的一個(gè)應(yīng)用,XML是SGML的一個(gè)子集,但是XML絕不是在 HTML上添加某些元素而形成的,它們之間是有很大區(qū)別的。最大的區(qū)別就是XML允許使用者為某種特殊目的而定義自已的元素。除此之外,另一個(gè)最主要的區(qū) 別就是XML致力解決的問(wèn)題,正是在使用HTML時(shí)所遇到的一些特殊問(wèn)題。 XML要求遵循一定的嚴(yán)格標(biāo)準(zhǔn),其分析程序比HTML瀏覽器對(duì)語(yǔ)法和結(jié)構(gòu)的要求更加嚴(yán)格。XML文檔每次分析的結(jié)果都一致,而HTML在不同的瀏覽器 中可能會(huì)作出不同的分析和顯示。同時(shí),XML標(biāo)準(zhǔn)是對(duì)數(shù)據(jù)的處理應(yīng)用,而不只是針對(duì)Web頁(yè)的,它還可涉及到數(shù)據(jù)庫(kù)電子商務(wù)系統(tǒng),以及任何顯示系統(tǒng)的高級(jí) 應(yīng)用。開發(fā)者可根據(jù)特定的工業(yè)需求,利用XML創(chuàng)建自定義的數(shù)據(jù)結(jié)構(gòu)。這些數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)可以在許多設(shè)備上查看,而不需要使用自定義的接口在不同的顯示 設(shè)備上查看相同的數(shù)據(jù)。 XML主要有三個(gè)要素:文檔類型聲明(DTD:Document Type Declaration)或XML Schema(XML大綱)、可擴(kuò)展樣式語(yǔ)言(XSL:eXtensible Stylesheet Language)和可擴(kuò)展鏈接語(yǔ)言(XLink:eXtensible Link Language)。DTD和XML大綱規(guī)定了XML文件的邏輯結(jié)構(gòu),定義了XML文件中的元素、元素的屬性以及元素與元素屬性之間的關(guān)系; Namespace(名域)實(shí)現(xiàn)了統(tǒng)一的XML文檔數(shù)據(jù)表示以及數(shù)據(jù)的相互集成;XSL是用于規(guī)定XML文檔呈現(xiàn)樣式的語(yǔ)言,它使得數(shù)據(jù)與其表現(xiàn)形式相互 獨(dú)立,比如XSL能使Web瀏覽器改變文檔的表示法,如數(shù)據(jù)顯示順序的變化,不需要再與服務(wù)器進(jìn)行通訊。通過(guò)改變樣式表,同一個(gè)文檔可以顯示得更大,或者 經(jīng)過(guò)折疊只顯示外面的一層,或者可以變?yōu)榇蛴〉母袷?。而XLink 將進(jìn)一步擴(kuò)展目前Web上已有的簡(jiǎn)單鏈接。 二、文檔對(duì)象模型(DOM) DOM是Document Object Model(文檔對(duì)象模型)的簡(jiǎn)稱,是對(duì)Web文檔進(jìn)行應(yīng)用開發(fā)、編程的應(yīng)用程序接口(API)。作為W3C公布的一種跨平臺(tái)、與語(yǔ)言無(wú)關(guān)的接口規(guī)范,DOM提供了在不同環(huán)境和應(yīng)用中的標(biāo)準(zhǔn)程序接口,可以用任何語(yǔ)言實(shí)現(xiàn)。 DOM采用對(duì)象模型和一系列的接口來(lái)描述XML文檔的內(nèi)容和結(jié)構(gòu),即利用對(duì)象把文檔模型化。這種對(duì)象模型實(shí)現(xiàn)的基本功能包括: ● 描述文檔表示和操作的接口; ● 接口的行為和屬性; ● 接口之間的關(guān)系以及互操作。 DOM可對(duì)結(jié)構(gòu)化的XML文檔進(jìn)行解析,文檔中的指令、元素、實(shí)體、屬性等所有內(nèi)容個(gè)體都用對(duì)象模型表示,整個(gè)文檔被看成是一個(gè)有結(jié)構(gòu)的信息樹,而不 是簡(jiǎn)單的文本流,生成的對(duì)象模型就是樹的節(jié)點(diǎn),對(duì)象同時(shí)包含了方法和屬性。因此,對(duì)文檔的所有操作都是在對(duì)象樹上的進(jìn)行。在DOM中,樹中的一切都是對(duì) 象,不管是根節(jié)點(diǎn)還是實(shí)體的屬性。 在DOM中主要有以下三個(gè)對(duì)象: ● XML文檔對(duì)象 XML文檔既是一種對(duì)象,同時(shí)又代表整個(gè)XML文檔。它由根元素和子元素組成。 ● XML節(jié)點(diǎn)對(duì)象 XML節(jié)點(diǎn)對(duì)象代表的是XML文檔內(nèi)部的節(jié)點(diǎn),如元素、注釋、名字空間等。 ● XML節(jié)點(diǎn)列表 XML文檔模塊列表代表了節(jié)點(diǎn)的集合。 利用DOM,開發(fā)人員可以動(dòng)態(tài)地創(chuàng)建XML文檔,遍歷結(jié)構(gòu),添加、修改、刪除內(nèi)容等。其面向?qū)ο蟮奶匦裕谷藗冊(cè)谔幚鞽ML解析相關(guān)的事務(wù)時(shí)節(jié)省大量的精力,是一種符合代碼重用思想的強(qiáng)有力編程工具。 三、MSXML 從理論上說(shuō),根據(jù)XML的格式定義,我們可以自己編寫一個(gè)XML的語(yǔ)法分析器,但實(shí)際上微軟已經(jīng)給我們提供了一個(gè)XML語(yǔ)法解析器,即一個(gè)叫做MSXML.DLL的動(dòng)態(tài)鏈接庫(kù),實(shí)際上它是一個(gè)COM(Component Object Model)對(duì)象庫(kù),里面封裝了進(jìn)行XML解析時(shí)所需要的所有對(duì)象。因?yàn)镃OM是一種以二進(jìn)制格式出現(xiàn)的和語(yǔ)言無(wú)關(guān)的可重用對(duì)象,所以你可以用任何語(yǔ)言(比如VB,VC,DELPHI,C++ Builder甚至是劇本語(yǔ)言等等)對(duì)它進(jìn)行調(diào)用,在你的應(yīng)用中實(shí)現(xiàn)對(duì)XML文檔的解析。 MSXML.DLL所包括的主要COM接口有: 1. DOMDocument DOMDocument對(duì)象是XML DOM的基礎(chǔ),你可以利用它所暴露的屬性和方法來(lái)瀏覽、查詢和修改XML文檔的內(nèi)容和結(jié)構(gòu)。DOMDocument表示了樹的頂層節(jié)點(diǎn),它實(shí)現(xiàn)了DOM文 檔的所有的基本方法,并且提供了額外的成員函數(shù)來(lái)支持XSL和XSLT。它創(chuàng)建了一個(gè)文檔對(duì)象,所有其他的對(duì)象都可以從這個(gè)文檔對(duì)象中得到和創(chuàng)建。 2. IXMLDOMNode IXMLDOMNode是文檔對(duì)象模型(DOM)中的基本對(duì)象,元素、屬性、注釋、過(guò)程指令和其他的文檔組件都可以認(rèn)為是IXMLDOMNode。事實(shí)上,DOMDocument對(duì)象本身也是一個(gè)IXMLDOMNode對(duì)象。 3. IXMLDOMNodeList IXMLDOMNodeList實(shí)際上是一個(gè)節(jié)點(diǎn)(Node)對(duì)象的集合,節(jié)點(diǎn)的增加、刪除和變化都可以在集合中立刻反映出來(lái),可以通過(guò)"for...next"結(jié)構(gòu)來(lái)遍歷所有的節(jié)點(diǎn)。 4. IXMLDOMParseError IXMLDOMParseError接口用來(lái)返回在解析過(guò)程中所出現(xiàn)的詳細(xì)的信息,包括錯(cuò)誤號(hào)、行號(hào)、字符位置和文本描述。 在具體應(yīng)用時(shí)可以用DOMDocument的Load方法來(lái)裝載XML文檔,用IXMLDOMNode 的selectNodes(查詢的結(jié)果有多個(gè),得到存放搜索結(jié)果的鏈表)或selectSingleNode(查詢的結(jié)果有一個(gè),在有多個(gè)的情況下返回找 到的第一個(gè)節(jié)點(diǎn))方法進(jìn)行查詢,用createNode和appendChild方法來(lái)創(chuàng)建節(jié)點(diǎn)和追加節(jié)點(diǎn),用IXMLDOMElement的 setAttribute和getAttribute方法來(lái)設(shè)置和獲得節(jié)點(diǎn)的屬性。 四、程序?qū)崿F(xiàn) 下面通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明在VC++中如何利用MSXML解析XML文檔。 ?。?)源XML文檔(xmlfile.xml)如下: <?xml version="1.0" encoding="GB2312"?> <Device id="10041" name="設(shè)備1"> <Type>13</Type> <TypeName>保護(hù)</TypeName> </Device> 我們?cè)谠次臋n中查找"Device",將其"name"屬性設(shè)置為"測(cè)試設(shè)備",為其添加"Model"節(jié)點(diǎn),并設(shè)置其文本為"3"。 ?。?)源程序如下: CoInitialize(NULL); // 初始化COM。 CComPtr<IXMLDOMDocument> spXMLDOM; HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument)); // 創(chuàng)建解析器實(shí)例。 VARIANT_BOOL bSuccess=false; hr=spXMLDOM->load(CComVariant(L"xmlfile.xml"),&bSuccess); // 裝載XML文檔。 CComBSTR bstrSS(L"Device"); CComPtr<IXMLDOMNode> spDevice; hr=spXMLDOM->selectSingleNode(bstrSS,&spDevice); //搜索"Device"。 CComQIPtr<IXMLDOMElement> spDev; spDev=spDevice; // 設(shè)置"Device"的"name"屬性。 hr= spDev ->setAttribute(CComBSTR(L"name"),CComVariant("測(cè)試設(shè)備")); CComPtr<IXMLDOMNode> spModelNode; hr=spXMLDOM->createNode(CComVariant(NODE_ELEMENT),ComBSTR ?。?Model"),NULL,& spModelNode); // 創(chuàng)建"Model"節(jié)點(diǎn)。 CComPtr<IXMLDOMNode> spInsertedNode; hr=spDevice->appendChild (spModelNode,&spInsertedNode); // 添加新節(jié)點(diǎn)到"Device"節(jié)點(diǎn)下面。 CString strID="3"; hr=spInsertedNode->put_text(strID.AllocSysString());// 設(shè)置"Model"的文本。 hr=spXMLDOM->save(CComVariant("xmlfile.xml")); / /保存文檔。 CoUninitialize(); // 結(jié)束對(duì)COM的使用。 因?yàn)槠脑颍鲜龃a的每步操作并未對(duì)返回的HRESULT類型進(jìn)行判斷,也未進(jìn)行異常的捕獲處理,在實(shí)際的編程中讀者應(yīng)根據(jù)返回的hr進(jìn)行決斷,以決定程序的流程,同時(shí)應(yīng)進(jìn)行異常的捕獲處理。 ?。?) 修改后的XML文檔如下 <?xml version="1.0" encoding="GB2312"?> <Device id="10041" name="測(cè)試設(shè)備"> <Type>13</Type> <TypeName>保護(hù)</TypeName> <Model>3</Model> </Device> 五、結(jié)束語(yǔ) 因?yàn)閄ML文檔有著比HTML更嚴(yán)格的語(yǔ)法要求,所以使用和編寫一個(gè)XML解析器要比編寫一個(gè)HTML解析器要容易得多。同時(shí)因?yàn)閄ML文檔不僅可以 標(biāo)記文檔的顯示屬性,更重要的是它標(biāo)記了文檔的結(jié)構(gòu)和包含信息的特征,所以我們可以方便地通過(guò)XML解析器來(lái)獲取特定節(jié)點(diǎn)的信息并加以顯示或修改,方便了 用戶對(duì)XML文檔的操作和維護(hù)。同時(shí)我們需要注意的是,XML是一種開放的結(jié)構(gòu)體系,并不依賴于任何一家公司,所以開發(fā)基于XML的應(yīng)用必然會(huì)得到絕大多 數(shù)軟件開發(fā)平臺(tái)的支持。 |
|
來(lái)自: yiherainbow > 《我的圖書館》