標籤:des style blog http color 使用 os io
轉自http://blog.csdn.net/dai_jing/article/details/8393392,原始出處不詳。
1.簡介
在.NET平台,微軟為C#或託管C++程式員提供了豐富的類庫,用以支援各種需求,其中就有對XML檔案操作的豐富的類。例如XMLDocument, XmlElement等。但是C++標準庫中並未提供相應的庫。本地開發的C++程式員一般採用開源類庫實現對XML檔案的操作,例如比較優秀的TinyXML。TinyXML是開源且可以任意免費使用的類庫,可以免費用於商業軟體中,因此使用者很多。但是在項目中維護第三方類庫有時比較麻煩,因此一些開發人員希望避免使用第三方的工具。微軟提供的MSXML可以實現對XML文檔的相關操作。
2.MSXML 和 DOM
MSXML全稱是Microsoft XML Core Service。MSXML提供的核心功能之一是解析XML檔案,並建立DOM樹,使用者可以通過介面方便的訪問DOM樹的內容,而不用自己進行記憶體的維護。如所示:
MSXML是以COM技術提供相關服務,通過CLSID或ProgID建立MSXML對象,因此使用MSXML需要基本的COM知識基礎。MSXML有多個版本,最新版是6.0,本文主要使用3.0版本,介紹基本的使用方式。
3.常用介面
IXMLDOMDocument 代表了XML的整個文檔。
IXMLDOMNode各類節點介面的父類。
IXMLDOMElement代表一個元素對象。繼承自IXMLDOMNode
IXMLDOMAttribute代表一個IXMLDOMElement節點的屬性對象,繼承自IXMLDOMNode
4. 樣本
#include "stdafx.h" #include<iostream> #include<objbase.h> #include<msxml2.h> #include<comutil.h> #import "msxml3.dll" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //首先初始化COM HRESULT hr; hr = CoInitialize(NULL); if( hr != S_OK ) { cout<<"Initialize COM error."<<endl; return 0; } //建立Document對象 MSXML2::IXMLDOMDocumentPtr pDoc; hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0"); if( FAILED(hr) ) { return 0; } if( FALSE == pDoc->load(_bstr_t("D:\\Book.xml")) ) return 0; //輸出XML檔案所有內容 cout<<"----------- Book.xml --------------"<<endl; cout<<pDoc->xml<<endl; cout<<"-----------------------------------"<<endl; //選擇內容的根節點 MSXML2::IXMLDOMElementPtr pElem = NULL; pElem = pDoc->selectSingleNode("catalog"); if(pElem==NULL) return 0; unsigned int nBookNum = pElem->childNodes->length; if( nBookNum == 0) return 0; cout <<"Their are "<< nBookNum << " book items in Book.xml file."<<endl; for(int i=0; i < nBookNum; i++) { MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i]; if(pBookNode==NULL) return 0; //讀取book節點的id屬性 MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("id"); cout<<"Book ID: "<<pId->text<<"\t"; //讀取book節點下author子節點 MSXML2::IXMLDOMNodePtr pAuthorNode = pBookNode->selectSingleNode("author"); if(pAuthorNode==NULL) { cout<<"Author: Error\t"; } else { cout<<"Author: "<< pAuthorNode->text<< "\t"; } cout<<endl; } CoUninitialize(); return 0; }
輸出結果:
5. COM智能指標
在範例程式碼中,我們看到使用了IXMLDOMElementPtr , IXMLDOMNodePtr 等智能指標,在MSDN中,並不能查到關於IXMLDOMElementPtr的資訊,而只有IXMLDOMElement,實際上尾碼帶有Ptr的是對應的COM介面的智能指標。在msxml3.tlh中,可以找到如下定義:
_COM_SMARTPTR_TYPEDEF(IXMLDOMElement, __uuidof(IXMLDOMElement));
_COM_SMARTPTR_TYPEDEF宏用於定義一個_com_ptr_t 對象,_com_ptr_t封裝了COM介面,稱之為智能指標,該模板類用於負責資源的分配和釋放,內部調用QueryInterface,AddRef,Release等IUnknown的函數。避免了編程人員對這些繁瑣的操作一一處理。
對上述宏展開後,就定義了智能指標 IXMLDOMElementPtr,其封裝了IXMLDOMElement介面。