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

输出结果:

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

    转自http://blog.csdn.net/dai_jing/article/details/8393392,原始出处不详. 1.简介 在.NET平台,微软为C#或托管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. 17个提升iOS开发效率的必用工具

    时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我们提升编码速度和工作效率的工 ...

  2. C# static 干货全解析

    讲解顺序 背景 静态字段 静态函数 静态方法 疑问解答 背景 static来源 在编写类的时候,有时候需要类里面的某个成员具有唯一性,也就是,对所有的对象都保持只有一个的状态.比如创建个人信息,我们都 ...

  3. mysql报Fatal error encountered during command execution的解决办法

    连接字符串里加上 Allow User Variables=True 解决. 否则时不时的报错,存储过程名长一点也报错,又有时报有时不报,参数传1位数就正常2位数就报错等…… 折腾mysql蛋疼啊

  4. angularJS中如何写控制器

    angularJS中的控制器是一个函数,用来向视图作用域中添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为 当我们在页面上创建一个新的控制器时,angularJS会生成并传递一个新 ...

  5. cxf框架使用(一)

    1.创建调用接口 @WebService public interface IQueryBusinessService { public @WebResult(name="QueryBusi ...

  6. php防止SQL注入详解及防范

    SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...

  7. mongodb 教程一

    mongodb是nosql(not only sql)的一种方式 .是对不同于传统的关系型数据库的数据库管理系统的统称. NoSQL - 代表着不仅仅是SQL- 没有声明性查询语言- 没有预定义的模式 ...

  8. 海园帮忙写的JQUERY功能,实现了我们想要的,我觉得有点屌哟~~

    需求就是为了可以在WEB在线更新代码期间,如果执行时间较长的话, 就在提交按钮之后,按钮变为灰色. 同时,一个DIV里每隔两秒刷新输出. 当更新完成之后(检测文档中的关键字串),按钮变为可提交状态~~ ...

  9. Xamarin for OSX – SetUp

    正常情况联网会失败 按照安装顺序进行安装(mono framework->java sdk-> android sdk->xamarin studio->xamarin.and ...

  10. 最小费用最大流MCMF zkw费用流

    稀疏图慢死了...但是稠密图效果还是很好的 struct MCMF{ struct tedge{int x,y,cap,w,next;}adj[maxm];int ms,fch[maxn]; int ...