【轉】msxml 操作xml

來源:互聯網
上載者:User

標籤: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介面。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.