• msxml 操作xml


     

    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. 示例

    1. #include "stdafx.h"   
    2. #include<iostream>   
    3. #include<objbase.h>   
    4. #include<msxml2.h>   
    5. #include<comutil.h>   
    6.    
    7. #import "msxml3.dll"   
    8. using namespace std;  
    9.   
    10. int _tmain(int argc, _TCHAR* argv[])  
    11. {  
    12.     //首先初始化COM   
    13.     HRESULT hr;  
    14.     hr = CoInitialize(NULL);   
    15.     if( hr != S_OK )  
    16.     {  
    17.         cout<<"Initialize COM error."<<endl;  
    18.         return 0;  
    19.     }  
    20.     //创建Document对象   
    21.     MSXML2::IXMLDOMDocumentPtr pDoc;  
    22.     hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0");  
    23.     if( FAILED(hr) )  
    24.     {  
    25.         return 0;  
    26.     }  
    27.     if( FALSE == pDoc->load(_bstr_t("D:\Book.xml")) )  
    28.         return 0;  
    29.   
    30.     //输出XML文件所有内容   
    31.     cout<<"----------- Book.xml --------------"<<endl;  
    32.     cout<<pDoc->xml<<endl;  
    33.     cout<<"-----------------------------------"<<endl;  
    34.   
    35.     //选择内容的根节点   
    36.     MSXML2::IXMLDOMElementPtr pElem = NULL;  
    37.     pElem = pDoc->selectSingleNode("catalog");  
    38.     if(pElem==NULL)  
    39.         return 0;  
    40.   
    41.     unsigned int nBookNum = pElem->childNodes->length;  
    42.     if( nBookNum == 0)  
    43.         return 0;  
    44.   
    45.     cout <<"Their are "<< nBookNum << " book items in Book.xml file."<<endl;  
    46.   
    47.     for(int i=0; i < nBookNum; i++)  
    48.     {  
    49.         MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i];  
    50.         if(pBookNode==NULL)  
    51.             return 0;  
    52.   
    53.         //读取book节点的id属性   
    54.         MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("id");  
    55.         cout<<"Book ID: "<<pId->text<<" ";  
    56.   
    57.         //读取book节点下author子节点   
    58.         MSXML2::IXMLDOMNodePtr pAuthorNode = pBookNode->selectSingleNode("author");  
    59.         if(pAuthorNode==NULL)  
    60.         {  
    61.             cout<<"Author: Error ";  
    62.         }  
    63.         else  
    64.         {  
    65.             cout<<"Author: "<< pAuthorNode->text<< " ";  
    66.         }  
    67.         cout<<endl;  
    68.     }  
    69. <SPAN style="WHITE-SPACE: pre"> CoUninitialize();</SPAN>  
    70.     return 0;  
    71. }  
    1. #include "stdafx.h"  
    2. #include<iostream>  
    3. #include<objbase.h>  
    4. #include<msxml2.h>  
    5. #include<comutil.h>  
    6.    
    7. #import "msxml3.dll"  
    8. using namespace std;  
    9.   
    10. int _tmain(int argc, _TCHAR* argv[])  
    11. {  
    12.     //首先初始化COM  
    13.     HRESULT hr;  
    14.     hr = CoInitialize(NULL);   
    15.     if( hr != S_OK )  
    16.     {  
    17.         cout<<"Initialize COM error."<<endl;  
    18.         return 0;  
    19.     }  
    20.     //创建Document对象  
    21.     MSXML2::IXMLDOMDocumentPtr pDoc;  
    22.     hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0");  
    23.     if( FAILED(hr) )  
    24.     {  
    25.         return 0;  
    26.     }  
    27.     if( FALSE == pDoc->load(_bstr_t("D:\Book.xml")) )  
    28.         return 0;  
    29.   
    30.     //输出XML文件所有内容  
    31.     cout<<"----------- Book.xml --------------"<<endl;  
    32.     cout<<pDoc->xml<<endl;  
    33.     cout<<"-----------------------------------"<<endl;  
    34.   
    35.     //选择内容的根节点  
    36.     MSXML2::IXMLDOMElementPtr pElem = NULL;  
    37.     pElem = pDoc->selectSingleNode("catalog");  
    38.     if(pElem==NULL)  
    39.         return 0;  
    40.   
    41.     unsigned int nBookNum = pElem->childNodes->length;  
    42.     if( nBookNum == 0)  
    43.         return 0;  
    44.   
    45.     cout <<"Their are "<< nBookNum << " book items in Book.xml file."<<endl;  
    46.   
    47.     for(int i=0; i < nBookNum; i++)  
    48.     {  
    49.         MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i];  
    50.         if(pBookNode==NULL)  
    51.             return 0;  
    52.   
    53.         //读取book节点的id属性  
    54.         MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("id");  
    55.         cout<<"Book ID: "<<pId->text<<" ";  
    56.   
    57.         //读取book节点下author子节点  
    58.         MSXML2::IXMLDOMNodePtr pAuthorNode = pBookNode->selectSingleNode("author");  
    59.         if(pAuthorNode==NULL)  
    60.         {  
    61.             cout<<"Author: Error ";  
    62.         }  
    63.         else  
    64.         {  
    65.             cout<<"Author: "<< pAuthorNode->text<< " ";  
    66.         }  
    67.         cout<<endl;  
    68.     }  
    69.     CoUninitialize();  
    70.     return 0;  
    71. }  

    输出结果:


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

  • 相关阅读:
    Codeforces Round #573 (Div. 2) C. Tokitsukaze and Discard Items
    Codeforces Round #573 (Div. 2) B
    练习2
    练习1
    上机练习4
    上机练习3
    上机练习1
    JAVA第一次作业
    es document的强制替换、创建、删除
    es 返回定制化的_source数据
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4504562.html
Copyright © 2020-2023  润新知