一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

VC 中利用MSXML解析XML文檔...

 yiherainbow 2007-12-31
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)的支持。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    久久精品欧美一区二区三不卡| 精品少妇一区二区视频| 欧美中文字幕日韩精品| 国产又粗又猛又爽又黄| 中文字幕欧美视频二区| 午夜久久精品福利视频| 在线日韩欧美国产自拍| 这里只有九九热精品视频| 好吊妞在线免费观看视频| 亚洲视频在线观看免费中文字幕| 亚洲国产日韩欧美三级| 视频一区二区 国产精品| 99热在线播放免费观看| 亚洲午夜精品视频观看| 日韩欧美中文字幕人妻| 黑人巨大精品欧美一区二区区| 绝望的校花花间淫事2| 亚洲最新一区二区三区| 九九热精品视频免费在线播放 | 亚洲中文字幕在线观看黑人| 女同伦理国产精品久久久| 91人妻人澡人人爽人人精品| 日韩欧美国产三级在线观看| 国产午夜精品福利免费不| 日韩一级毛一欧美一级乱| 九九热九九热九九热九九热| 国产乱淫av一区二区三区| 男人和女人干逼的视频| 少妇毛片一区二区三区| 日韩中文高清在线专区| 婷婷一区二区三区四区| 日韩欧美黄色一级视频| 偷拍洗澡一区二区三区| 日本免费一区二区三女| 日韩精品中文字幕在线视频| 日韩一区二区三区有码| 免费在线成人激情视频| 九九热精彩视频在线免费| 欧美日韩最近中国黄片| 中文字幕精品一区二区三| 国产欧美日产久久婷婷|