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. 示例
- #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;
- }
- <SPAN style="WHITE-SPACE: pre"> CoUninitialize();</SPAN>
- return 0;
- }
- #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接口。
msxml 操作xml的更多相关文章
- 【转】msxml 操作xml
转自http://blog.csdn.net/dai_jing/article/details/8393392,原始出处不详. 1.简介 在.NET平台,微软为C#或托管C++程序员提供了丰富的类库, ...
- Delphi操作XML简介
参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...
- VC++中操作XML(MFC、SDK)转
[转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...
- C#中操作xml文件(插入节点、修改、删除)
已知有一个xml文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...
- Tinyxml 操作XML
对于xml文件,目前的工作只是集中在配置文件和作为简单的信息文件来用,因此我不太喜欢使用msxml这种重量级的xml解析器,特别是使用msxml解析xml涉及到复杂的com类型转换,更是令人感觉繁琐. ...
- 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++
目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与I ...
- [转]VC++中操作XML(MFC、SDK)
XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和Xml ...
- delphi操作xml学习笔记 之一 入门必读
Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
随机推荐
- MySQL 创建数据库
MySQL 创建数据库 使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以 ...
- 从零开始学java(小游戏 石头剪刀布)
Game.java package com.java;import java.util.Scanner;public class Game { private Player player ...
- PHP简单计算器
工作之余,写着玩的. <?php $num1 = $_POST['num1']; $num2 = $_POST['num2']; $yusuan = $_POST['yusuan']; $jie ...
- eval("("+json对象+")")
var obj=eval("("+data+")"); 看看下面这条,应该能想到json的数据结构“+(json对象名)+”由于json是以”{}”的方式来开始 ...
- 【PRO ASP.NE MVC4 学习札记】使用Moq辅助进行单元测试
清楚问题所在: 先开个头,当我们对A进行单元测试时,可能会发现A的实现必须要依赖B.这时,我们在写单元测试时,就必须先创建B的实例,然后把B传给A再建立A的实例进行测试. 这样就会出现一些问题: 1. ...
- 透明与Z序示例
import QtQuick 2.4 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 import QtQuick.Win ...
- keil中使用_at_绝对地址定位
使用_at_关键字对存储器进行绝对地址定位程序如下: #include<reg51.h> ] _at_ 0x8000; main() { LED_Data[] = 0x23; } 在kei ...
- Xamarin.Forms WebView
目前本地或网络的网页内容和文件加载 WebView是在您的应用程序显示Web和HTML内容的视图.不像OpenUri,这需要用户在Web浏览器的设备上,WebView中显示您的应用程序内的HTML内容 ...
- vim插件
所需即所获:像 IDE 一样使用 vim https://github.com/yangyangwithgnu/use_vim_as_ide mark.vim http://www.vim.org/s ...
- windows客户端连接到samba服务器(如何使用samba)
首先确保你的服务端已经配置好samba并成功启动服务,方法可参考此文章http://blog.csdn.net/linglongwunv/archive/2010/01/19/5212875.aspx ...