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

  四、程序實現

  下面通過一個具體的實例來說明在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 簡介

  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方法來設置和獲得節點的屬性。 


 

發佈了4 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章