转自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 ;
}
//创建Document对象
MSXML2::IXMLDOMDocumentPtr pDoc;
hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0");
if( FAILED(hr) )
{
return ;
}
if( FALSE == pDoc->load(_bstr_t("D:\\Book.xml")) )
return ; //输出XML文件所有内容
cout<<"----------- Book.xml --------------"<<endl;
cout<<pDoc->xml<<endl;
cout<<"-----------------------------------"<<endl; //选择内容的根节点
MSXML2::IXMLDOMElementPtr pElem = NULL;
pElem = pDoc->selectSingleNode("catalog");
if(pElem==NULL)
return ; unsigned int nBookNum = pElem->childNodes->length;
if( nBookNum == )
return ; cout <<"Their are "<< nBookNum << " book items in Book.xml file."<<endl; for(int i=; i < nBookNum; i++)
{
MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i];
if(pBookNode==NULL)
return ; //读取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 ;
}

输出结果:

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

【转】msxml 操作xml的更多相关文章

  1. msxml 操作xml

    1.简介 在.NET平台,微软为C#或托管C++程序员提供了丰富的类库,用以支持各种需求,其中就有对XML文件操作的丰富的类.例如XMLDocument, XmlElement等.但是C++标准库中并 ...

  2. Delphi操作XML简介

    参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...

  3. VC++中操作XML(MFC、SDK)转

    [转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...

  4. C#中操作xml文件(插入节点、修改、删除)

    已知有一个xml文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...

  5. Tinyxml 操作XML

    对于xml文件,目前的工作只是集中在配置文件和作为简单的信息文件来用,因此我不太喜欢使用msxml这种重量级的xml解析器,特别是使用msxml解析xml涉及到复杂的com类型转换,更是令人感觉繁琐. ...

  6. 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++

    目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与I ...

  7. [转]VC++中操作XML(MFC、SDK)

    XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和Xml ...

  8. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  9. Asp.Net 操作XML文件的增删改查 利用GridView

    不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...

随机推荐

  1. vue项目中provide和inject的运用

    类型: provide:Object | () => Object inject:Array<string> | { [key: string]: string | Symbol | ...

  2. vue - webpack.dev.conf.js for FriendlyErrorsPlugin

    描述:webpack网页端友好的报错信息就来自它 官网:https://www.npmjs.com/package/friendly-errors-webpack-plugin new Friendl ...

  3. python的基本知识点

    一.数据类型 1.整数2.浮点数3.字符串4.布尔值:True/False5.空值:None 二.变量 变量名必须是大小写英文.数字和_的组合,且不能以数字开头 三.常量 全部大写的变量名表示常量,p ...

  4. STL源码剖析(deque)

    deque是一个双向开口的容器,在头尾两端进行元素的插入跟删除操作都有理想的时间复杂度. deque使用的是分段连续线性空间,它维护一个指针数组(T** map),其中每个指针指向一块连续线性空间. ...

  5. 如何为Drupal缓存对象指定缓存类?

    什么意思?意思是说,假如你有这样的需求,需要将cache_page缓存到数据库,其它的都缓存到memcache,这该怎么办? 看看_cache_get_object()的实现你就会知道上面的问题该怎么 ...

  6. FAT AP v200R005 配置二层透明模式(web&命令行,开局)

    背景: vlan123:用户业务vlan,192.168.1.0/24 Vlan2001:管理vlan,172.168.129.0/24 vlan1:默认vlan,不建议使用. 注意事项: 配置服务集 ...

  7. xcode9.2 objective-c install (mac 10.12.6)

    1. xcode下载: https://download.developer.apple.com/Developer_Tools/Xcode_9.2/Xcode_9.2.xip 2. 点击默认安装即可 ...

  8. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!问题解决

    用mac终端ssh连接Linux服务器,提示以下错误: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: RE ...

  9. PHP 时间与日期

    PHP提供了大量的内置函数,使开发者在时间的处理上游刃有余,大大提高了工作效率. 介绍一些常见的PHP日期和时间函数以及日期和时间的处理. 经常使用的日期和时间处理函数 函 数 说  明 checkd ...

  10. Bash中的括号(三)

    1.两个小括号用来对整数进行算术运算和逻辑运算,比如. 例如给变量赋值: $ a=+; echo $a + $ (( b = + )); echo $b 1+1 只是一个字符串,而 b 就是一个算术表 ...