DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> VC++中利用MSXML解析XML文檔
VC++中利用MSXML解析XML文檔
編輯:XML詳解     

一、 XML 簡介

  XML(Xtensible Markup Language,即擴展標記語言)的發展起源於1996年。當時,出版界巨頭和Web業內人士經過共同討論,提出了創建SGML(Standard Generalized Markup Language,即標准通用標識語言)子集(HML)的建議。該子集專用於Web,具有可擴展(或可擴充)性,並且能利用結構化標記語言的所有高級功能,但摒棄了SGML的復雜性。XML規范的第一份草稿於1996年11月發布後不久,1997年1月首個XML解析器就面世了。隨後,便出現了XML的應用以及新的規范和解析器。

  HTML(Hypertext Markup Language)語言是大家所熟悉的開發網頁的一種標記語言,但它不是一種編程語言,它的主要標記是針對文檔內容本身結構的描述,因機器本身是不能夠解析它的內容的。XML語言是SGML語言的子集,它保留了SGML主要的使用功能,同時大大減小了SGML的復雜性。它不僅能表示文檔的內容,而且可以表示文檔的結構,這樣在能夠被人類理解的同時,也能夠被機器所理解。雖然HTML是SGML的一個應用,XML是SGML的一個子集,但是XML絕不是在HTML上添加某些元素而形成的,它們之間是有很大區別的。最大的區別就是XML允許使用者為某種特殊目的而定義自已的元素。除此之外,另一個最主要的區別就是XML致力解決的問題,正是在使用Html時所遇到的一些特殊問題。

  XML要求遵循一定的嚴格標准,其分析程序比HTML浏覽器對語法和結構的要求更加嚴格。XML文檔每次分析的結果都一致,而Html在不同的浏覽器中可能會作出不同的分析和顯示。同時,XML標准是對數據的處理應用,而不只是針對Web頁的,它還可涉及到數據庫電子商務系統,以及任何顯示系統的高級應用。開發者可根據特定的工業需求,利用XML創建自定義的數據結構。這些數據結構和數據庫可以在許多設備上查看,而不需要使用自定義的接口在不同的顯示設備上查看相同的數據。

XML主要有三個要素:文檔類型聲明(DTD:Document Type Declaration)或XML Schema(XML大綱)、可擴展樣式語言(XSL:eXtensible Stylesheet Language)和可擴展鏈接語言(XLink:eXtensible Link Language)。DTD和XML大綱規定了XML文件的邏輯結構,定義了XML文件中的元素、元素的屬性以及元素與元素屬性之間的關系;Namespace(名域)實現了統一的XML文檔數據表示以及數據的相互集成;XSL是用於規定XML文檔呈現樣式的語言,它使得數據與其表現形式相互獨立,比如XSL能使Web浏覽器改變文檔的表示法,如數據顯示順序的變化,不需要再與服務器進行通訊。通過改變樣式表,同一個文檔可以顯示得更大,或者經過折疊只顯示外面的一層,或者可以變為打印的格式。而XLink 將進一步擴展目前Web上已有的簡單鏈接。

  二、文檔對象模型(DOM)

  DOM是Document Object Model(文檔對象模型)的簡稱,是對Web文檔進行應用開發、編程的應用程序接口(API)。作為W3C公布的一種跨平台、與語言無關的接口規范,DOM提供了在不同環境和應用中的標准程序接口,可以用任何語言實現。

  DOM采用對象模型和一系列的接口來描述XML文檔的內容和結構,即利用對象把文檔模型化。這種對象模型實現的基本功能包括:

  ● 描述文檔表示和操作的接口;

  ● 接口的行為和屬性;

  ● 接口之間的關系以及互操作。

  DOM可對結構化的XML文檔進行解析,文檔中的指令、元素、實體、屬性等所有內容個體都用對象模型表示,整個文檔被看成是一個有結構的信息樹,而不是簡單的文本流,生成的對象模型就是樹的節點,對象同時包含了方法和屬性。因此,對文檔的所有操作都是在對象樹上的進行。在DOM中,樹中的一切都是對象,不管是根節點還是實體的屬性。

在DOM中主要有以下三個對象:

  ● XML文檔對象 XML文檔既是一種對象,同時又代表整個XML文檔。它由根元素和子元素組成。

  ● XML節點對象 XML節點對象代表的是XML文檔內部的節點,如元素、注釋、名字空間等。

  ● XML節點列表 XML文檔模塊列表代表了節點的集合。

  利用DOM,開發人員可以動態地創建XML文檔,遍歷結構,添加、修改、刪除內容等。其面向對象的特性,使人們在處理XML解析相關的事務時節省大量的精力,是一種符合代碼重用思想的強有力編程工具。

  三、MSXML

  從理論上說,根據XML的格式定義,我們可以自己編寫一個XML的語法分析器,但實際上微軟已經給我們提供了一個XML語法解析器,即一個叫做MSXML.DLL的動態鏈接庫,實際上它是一個COM(Component Object Model)對象庫,裡面封裝了進行XML解析時所需要的所有對象。因為COM是一種以二進制格式出現的和語言無關的可重用對象,所以你可以用任何語言(比如VB,VC,Delphi,C++ Builder甚至是劇本語言等等)對它進行調用,在你的應用中實現對XML文檔的解析。

  MSXML.DLL所包括的主要COM接口有:

  1. DOMDocument

  DOMDocument對象是XML DOM的基礎,你可以利用它所暴露的屬性和方法來浏覽、查詢和修改XML文檔的內容和結構。DOMDocument表示了樹的頂層節點,它實現了DOM文檔的所有的基本方法,並且提供了額外的成員函數來支持XSL和XSLT。它創建了一個文檔對象,所有其他的對象都可以從這個文檔對象中得到和創建。

  2. IXMLDOMNode

  IXMLDOMNode是文檔對象模型(DOM)中的基本對象,元素、屬性、注釋、過程指令和其他的文檔組件都可以認為是IXMLDOMNode。事實上,DOMDocument對象本身也是一個IXMLDOMNode對象。

3. IXMLDOMNodeList

  IXMLDOMNodeList實際上是一個節點(Node)對象的集合,節點的增加、刪除和變化都可以在集合中立刻反映出來,可以通過"for...next"結構來遍歷所有的節點。

  4. IXMLDOMParseError

  IXMLDOMParseError接口用來返回在解析過程中所出現的詳細的信息,包括錯誤號、行號、字符位置和文本描述。

  在具體應用時可以用DOMDocument的Load方法來裝載XML文檔,用IXMLDOMNode 的selectNodes(查詢的結果有多個,得到存放搜索結果的鏈表)或selectSingleNode(查詢的結果有一個,在有多個的情況下返回找到的第一個節點)方法進行查詢,用createNode和appendChild方法來創建節點和追加節點,用IXMLDOMElement的setAttribute和getAttribute方法來設置和獲得節點的屬性。

  四、程序實現

  下面通過一個具體的實例來說明在VC++中如何利用MSXML解析XML文檔。

  (1)源XML文檔(xmlfile.XML)如下:

  <?XML version="1.0" encoding="GB2312"?>
   <Device id="10041" name="設備1">
   <Type>13</Type>
   <TypeName>保護</TypeName>
   </Device>

   我們在源文檔中查找"Device",將其"name"屬性設置為"測試設備",為其添加"Model"節點,並設置其文本為"3"。

  (2)源程序如下:

  CoInitialize(NULL); // 初始化COM。
   CComPtr<IXMLDOMDocument> spXMLDOM;
   HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));
   // 創建解析器實例。
   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;
   // 設置"Device"的"name"屬性。
   hr= spDev ->setAttribute(CComBSTR(L"name"),CComVariant("測試設備"));
   CComPtr<IXMLDOMNode> spModelNode; hr=spXMLDOM->createNode(CComVariant(NODE_ELEMENT),ComBSTR
   ("Model"),NULL,& spModelNode); // 創建"Model"節點。
   CComPtr<IXMLDOMNode> spInsertedNode;
   hr=spDevice->appendChild (spModelNode,&spInsertedNode);
   // 添加新節點到"Device"節點下面。
   CString strID="3";
   hr=spInsertedNode->put_text(strID.AllocSysString());// 設置"Model"的文本。
   hr=spXMLDOM->save(CComVariant("xmlfile.XML")); / /保存文檔。
   CoUninitialize(); // 結束對COM的使用。

   因為篇幅的原因,上述代碼的每步操作並未對返回的HRESULT類型進行判斷,也未進行異常的捕獲處理,在實際的編程中讀者應根據返回的hr進行決斷,以決定程序的流程,同時應進行異常的捕獲處理。

  (3) 修改後的XML文檔如下

  <?XML version="1.0" encoding="GB2312"?>
   <Device id="10041" name="測試設備">
   <Type>13</Type>
   <TypeName>保護</TypeName>
   <Model>3</Model>
   </Device>

  五、結束語

  因為XML文檔有著比HTML更嚴格的語法要求,所以使用和編寫一個XML解析器要比編寫一個Html解析器要容易得多。同時因為XML文檔不僅可以標記文檔的顯示屬性,更重要的是它標記了文檔的結構和包含信息的特征,所以我們可以方便地通過XML解析器來獲取特定節點的信息並加以顯示或修改,方便了用戶對XML文檔的操作和維護。同時我們需要注意的是,XML是一種開放的結構體系,並不依賴於任何一家公司,所以開發基於XML的應用必然會得到絕大多數軟件開發平台的支持。


 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved