close
文章出處

轉自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接口。


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()