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

分享

在VC6中使用MSXML 4.0 DOM處理XML文檔(1) - MSXML - 技術(shù)應(yīng)用...

 軟件團(tuán)隊頭目 2008-10-16
1.DOM與XML

  DOM是DocumentObjectModel的縮寫,提供了與XML交互的標(biāo)準(zhǔn)編程模型:(1)提供了標(biāo)準(zhǔn)方法在程序中創(chuàng)建、遍歷或者更新XML文檔內(nèi)容。(2)提供了一組核心的與供應(yīng)商和語言無關(guān)的應(yīng)用程序編程接口(API),可滿足與XML交互的大部分需求。因此,DOMAPIs成為應(yīng)用程序和XML文檔之間互通的橋梁。

  W3C(WorldWideWebConsortium)DOMLevel1規(guī)范定義了兩組DOM編程接口:

  (1)基本接口:W3C基本接口定義了用來在應(yīng)用程序中操縱XML文檔的接口;

 ?。?)擴(kuò)展接口:W3C擴(kuò)展接口定義了一些方便開發(fā)者的接口。

  所有XML處理程序必須支持Unicode字符編碼的兩種形式:UTF-8和UTF-16。XMLParser可以讀取使用ISO-8859-1、Big-5或者Shift-JIS編碼的文檔,并在加載文檔時將它們自動轉(zhuǎn)換為Unicode。

  如果XML文檔使用的字符編碼不是UTF-8(8-bitASCII文本也是可接受的UTF-8)或者UTF-16,那么它必須在XML聲明中提供字符編碼聲明,否則XMLParser可能會出錯。當(dāng)然,即使對字符編碼進(jìn)行了聲明,Parser也可能不能夠處理(不支持該編碼),但能夠正確地給出提示信息。(由于XML聲明是使用基本的ASCII文本書寫的,Parser能夠正確地讀出它的內(nèi)容。)

  2.MSXML4.0簡介

  MSXML(MicrosoftXMLCoreServices)是Microsoft提供的用于處理XML文檔的COM庫。MSXMLDOM不僅實現(xiàn)了W3CDOMLevel1規(guī)范定義的基本接口和擴(kuò)展接口,還提供了額外的方法來支持XSLTransformation(XSLT)、XPath、名字空間和數(shù)據(jù)類型。MSXML除了支持規(guī)范所要求的字符編碼外,還支持更多的字符編碼格式,而在內(nèi)部使用UnicodeUCS-2字符編碼處理XML文檔中的所有文本。

  本文以VisualC++6.0為開發(fā)環(huán)境,介紹MSXML4.0SDK中DOM的使用。另外,MSXML中的SAX也比較常用。

 2.1.MSXMLDOM

  MSXMLDOM是本文介紹的重點,它提供了豐富的接口方便在程序中操作XML文檔。DOM在內(nèi)存中提供了XML文檔的完整表示,允許對整個文檔內(nèi)容的隨機(jī)訪問。DOM允許應(yīng)用程序依賴于MSXMLParser提供的邏輯結(jié)構(gòu)來處理基于XML的信息。其工作流程和原理如下圖所示(源自MSXML4.0SDK):

在VC6中使用MSXML 4.0 DOM處理XML文檔

  當(dāng)MSXMLParser把一個XML文檔加載進(jìn)DOM時,它從頭到尾讀入整個XML文檔,并構(gòu)建內(nèi)在邏輯樹結(jié)構(gòu)。文檔本身被認(rèn)為是包含其它所有節(jié)點的單個節(jié)點,例如,它包含根元素(RootElement),而根元素則包含文檔中所有的元素、屬性和文本節(jié)點。

  MSXMLDOM樹中每一個節(jié)點都有特定的類型(如元素、屬性、文本),也有指向父節(jié)點和子節(jié)點的成員。其中,屬性節(jié)點是一個特殊的節(jié)點,它不是子節(jié)點,是元素的屬性。

  2.2.MSXMLSAX2

  有時,使用SAX(SimpleAPIforXML)來解決XML應(yīng)用可能是一個更好的選擇。DOM方式允許開發(fā)者利用MSXML維護(hù)的DOM樹,而不用自己來管理。但有時,開發(fā)者需要更高的效率時,可能只需要讀入XML文檔,而在程序內(nèi)部構(gòu)造數(shù)據(jù)結(jié)構(gòu)來管理XML文檔信息,這時就可以選擇SAX方式。下圖是MSXMLSAX2的工作流程和原理圖(源自MSXML4.0SDK):

在VC6中使用MSXML 4.0 DOM處理XML文檔

  3.安裝MSXML4.0SDK

  早期的MSXML版本,特別是MSXML2.5和MSXML3.0,借助于xmlinst.exe工具,可以以替換模式進(jìn)行安裝。在替換模式下,新安裝的MSXML版本替換舊版本,從而變成缺省的XMLParser。當(dāng)你在程序中使用版本無關(guān)的CLSID和ProgID時,缺省的XMLParser就被調(diào)用。這常常引起舊程序的兼容性問題?;谶@個原因,MSXML4.0只能以Side-by-side模式進(jìn)行安裝。Xmlinst.exe工具在MSXML4.0中不再提供,也不適用于MSXML4.0。
MSXML4.0SDK(MicrosoftXMLCoreServices4.0SoftwareDevelopmentKet)是以side-by-side模式安裝在你的機(jī)器上的。這種模式有助于保護(hù)那些使用msxml.dll、msxml2.dll,或者msxml3.dll的應(yīng)用程序,使其不受干擾,仍可照常使用。Side-by-side模式允許你決定使用哪個版本的Parser來為你工作,這可在你的代碼中指定。

  從MicrosoftXMLDownloadCenter下載回安裝程序,安裝程序?qū)⒃谀愕臋C(jī)器上安裝三個文件:msxml4.dll、msxml4a.dll和msxml4r.dll,并對msxml4.dll進(jìn)行注冊。

  或者,你也可以手動安裝MSXML,如果你樂意的話。首先,拷貝上面的三個dll文件到機(jī)器的系統(tǒng)目錄($sysRootsystem32),一般是C:WINDOWSsystem32;然后,運(yùn)行cmd,執(zhí)行命令:(1)cdC:WINDOWSsystem32 (2)regsvr32msxml4.dll。

  在安裝MSXML4.0SDK后,應(yīng)用程序必須使用版本相關(guān)的CLSID和ProgID來顯式地實例化Parser,這確保你的應(yīng)用程序的穩(wěn)定性。

  4.使用MSXMLDOM

  本節(jié)介紹在VC6.0中使用MSXMLDOM處理XML文檔。下面的示例中將動態(tài)生成一個XML文檔,并對文檔進(jìn)行查詢。

  4.1.導(dǎo)入MSXML

  首先,需要導(dǎo)入MSXML頭文件和庫到VC6.0工程中。有兩種導(dǎo)入方式:

 ?。?)自動方式,在源代碼中添加如下兩行程序即可:

  #import<msxml4.dll>

  usingnamespaceMSXML2;

 ?。?)手動方式(有存在的理由么?呵呵)

  a)找到MSXML4.0SDK的安裝目錄,去發(fā)現(xiàn)兩個子目錄inc和lib;

  b)在VC選項中,將MSXML4.0下inc和lib子目錄添加到默認(rèn)的頭文件和庫文件搜索路徑中;

  c)在使用MSXML的源文件中包含頭文件<msxml2.h>;

  d)在工程設(shè)置中將msxml2.lib添加到要鏈接的庫中。
 
 以自動方式導(dǎo)入MSXML,會在你的工程目錄下(或者Debug/Release下)生成兩個頭文件msxml4.tlh和msxml4.tli(前者為頭文件聲明,后者為內(nèi)聯(lián)函數(shù)定義文件)。

  4.2.XML樣例文檔

  后面的程序中將動態(tài)生成如下XML文檔,然后對該文檔進(jìn)行查詢。

<?xmlversion="1.0"encoding="utf-8"?>
<!--SampleXMLfilecreatedusingXMLDOMobject.-->
<request>
 <identification>
  <userName>tyc</userName>
  <password>pwd</password>
 </identification>
 
 <commandLinescount="2"reply="no"immediate="yes">
  <commandnum="1">
   <type>backup</type>
   <dbName>db1359</dbName>
  </command>
  <commandnum="2">
   <type>save</type>
   <data><![CDATA[這里是XML文檔的CDATA數(shù)據(jù)段...]]></data>
  </command>
 </commandLines>
</request>

  4.3.用到的COM技術(shù)

  與其它COM技術(shù)一樣,MSXML也使用引用計數(shù)來管理DOM對象的生存期。當(dāng)使用MSXML中的COM裸接口指針時,程序員必須負(fù)責(zé)處理該指針的引用計數(shù):調(diào)用AddRef增加引用計數(shù);調(diào)用Release減少引用計數(shù)。

  例如,當(dāng)調(diào)用IXMLDOMDocument::createNode、IXMLDOMNode::appendChild或者CoCreateInstance創(chuàng)建或者獲取對象時,對象的引用計數(shù)已經(jīng)在函數(shù)返回前增加了,而你卻有責(zé)任在使用完這些指針后調(diào)用Release釋放對象。如果你復(fù)制一個已存在對象的引用,你必須調(diào)用AddRef增加相應(yīng)的引用計數(shù)。
 
4.4.MSXMLDOM中裸指針與智能指針的用法區(qū)別

  MSXML中成員函數(shù)有兩類,一類成員函數(shù)的返回值是通過參數(shù)返回的,而函數(shù)本身返回HRESULT作為操作成功與否的標(biāo)識,如果函數(shù)返回的值(通過參數(shù))是指針,那么該指針是裸指針,這里把這類用法稱為裸用法,這種函數(shù)稱為裸函數(shù);另一類成員函數(shù)是對前面的裸函數(shù)的簡單封裝形式,把裸函數(shù)的返回值作為真正的返回值返回,如果是返回指針,則指針不再是裸指針,而是經(jīng)過封裝的智能指針。一般前類函數(shù)的函數(shù)名中有下劃線,而后者沒有。你可以在生成的msxml4.tli文件中看到這種封裝。

  4.5.源程序

  不多說了,看代碼吧。(注:本來想貼上所有代碼的,但系統(tǒng)字?jǐn)?shù)限制,只好刪除了兩個實現(xiàn)函數(shù),請看文后的源程序打包文件)

#include<iostream>
#include<string>
#include<cassert>
 
usingnamespacestd;
 
#import<msxml4.dll>
usingnamespaceMSXML2;
 
boolgenerateXMLSampleFile(conststring&path);
boolqueryXMLSampleFile(conststring&path);
 
intmain()
{
  //初始化COM庫
  CoInitialize(NULL);
 
  //創(chuàng)建XML文件及其內(nèi)容
  if(!generateXMLSampleFile("sample.xml"))
    cout<<"Failed"<<endl;
 
  //加載剛生成的XML文件,將其輸出到標(biāo)準(zhǔn)輸出中予以顯示
  IXMLDOMDocument2PtrpXMLDom;
  HRESULThr=pXMLDom.CreateInstance(__uuidof(DOMDocument40));
  if(FAILED(hr)){
    cout<<"FailedtoinstantiateDOMDocument40class!"<<endl;
    return-1;
  }
  
  if(pXMLDom->load("sample.xml")!=VARIANT_TRUE){
    cout<<"Failedloadxmldatafromfile:"<< 
      static_cast<char*>(pXMLDom->parseError->Getreason())<<endl;
    return-1;
  }
 
  //下面輸出XML文件內(nèi)容,但奇怪的是文件頭中沒有編碼的部分!
  cout<<static_cast<char*>(pXMLDom->xml)<<endl;
 
  pXMLDom.Release(); //注意,不能用pXMLDom->Release()這種形式!
 
  //對剛生成的XML文件進(jìn)行查詢
  cout<<"---------------------------------------"<<endl;
  cout<<"Startquery..."<<endl;
  queryXMLSampleFile("sample.xml");
  
  CoUninitialize();
 
  return0;
}

 

  補(bǔ)充下,如果是遍歷一個未知XML文檔,就需要使用IXMLDOMDocumentPtr的documentElement獲得根元素,使用IXMLDOMNodePtr的firstChild、nextSibling成員獲得一個節(jié)點的所有子節(jié)點;使用IXMLDOMNodePtr的nodeType成員來判斷節(jié)點類型(元素、屬性、文本,等等),使用text成員得到文本值,使用nodeName成員得到節(jié)點名。還可以使用IXMLDOMDocumentPtr、IXMLDOMNodePtr等的xml成員獲得相應(yīng)的xml字符串。另詳細(xì)的資料請參考MSXML4.0SDK文檔。

  另外,在程序中動態(tài)創(chuàng)建的text節(jié)點的text值的數(shù)據(jù)量大小是有限的,在我的機(jī)器上測試發(fā)現(xiàn)(默認(rèn)VC配置),使用256K的數(shù)據(jù)還正常,但使用512K的數(shù)據(jù)時就StackOverflow了。但是,加載XML文檔時是沒有問題的,其數(shù)據(jù)量并不受此限制。

  最后,在你使用MSXMLDOM時,請清醒地認(rèn)識到它在內(nèi)部是一顆樹的表示,任何數(shù)據(jù)都是以節(jié)點形式存在的。That’sall!

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产午夜在线精品视频| 91老熟妇嗷嗷叫太91| 国产欧洲亚洲日产一区二区| 日韩欧美国产精品中文字幕| 亚洲午夜精品视频在线| 国产老女人性生活视频| 国产免费无遮挡精品视频| 夫妻性生活黄色录像视频| 99一级特黄色性生活片| 色播五月激情五月婷婷| 香蕉久久夜色精品国产尤物| 亚洲国产成人久久一区二区三区| 亚洲精选91福利在线观看| 加勒比系列一区二区在线观看| 精品日韩中文字幕视频在线| 99热中文字幕在线精品| 国产一区国产二区在线视频| 精品少妇人妻av免费看| 国产又黄又爽又粗视频在线| 国产内射一级一片内射高清视频| 久久午夜福利精品日韩| 丝袜视频日本成人午夜视频| 欧美尤物在线视频91| 日韩女优视频国产一区| 五月婷婷综合激情啪啪| 精品一区二区三区免费看| 久久国产精品亚州精品毛片| 午夜福利国产精品不卡| 亚洲黄色在线观看免费高清| 欧美午夜一级特黄大片| 日本本亚洲三级在线播放| 欧美自拍系列精品在线| 亚洲精品国产主播一区| 欧美极品欧美精品欧美| 日韩精品视频高清在线观看| 久草精品视频精品视频精品| 免费观看潮喷到高潮大叫| 欧美日韩久久精品一区二区| 中文字幕高清免费日韩视频| 国产欧美韩日一区二区三区| 日本av在线不卡一区|