C++操作msxml的学习实例

最近工作上的需要,需要使用C++来与xml进行交互,在学习的过程中遇到了一些问题,从网上也搜索了一些资料,在这里总结一下,既是对初学的梳理,也能方便大家需要接触的人。

  1. 对xml的认识。

xml是一种相对规范严整的解释语言。具体的语法大家可以去查,对我们使用的角度来说,我们只需要了解,他有很多节点(元素)组成,从父元素到其子元素,子元素可以为空,资源拥有属性,可以方便存储数据。以下是一个xml的示例文档:

 <?xml version ="1.0" encoding="UTF-8"?>
<Picture>
<Circle>
<circle name="circle1" radius="12.5"/>
<circle name="circle2" radius="56.5"/>
</Circle>
<Rectangle>
<rectangle name ="rectangle1" rec_long="20.5" rec_weight="15"/>
<rectangle name ="rectangle1" rec_long="40" rec_weight="25"/>
<rectangle name ="rectangle1" rec_long="60" rec_weight="45"/>
</Rectangle>
</Picture>

2.本实例使用的准备工作

我们使用的平台是VS2005,使用msxml4,使用前准备工作如下:

  1. 下载安装msxml4;
  2. 利用VS2005新建一个项目,我这里使用的是对话框的项目。这里面使用了一个树的控件(TreeControl)
  3. 在项目的stdafx.h头文件最后添上语句:

    #import "msxml4.dll"
    using namespace MSXML2;

    我在这里的时候遇到一个问题:在使用接口时总是报出“error:XX函数:不能确定的符号”,这就让我很迷惑,即使我新插入的msxml4.dll可能有冲突,怎么还会报错呢?况且我还使用了using namespace MSXML2的语句。问题的解决办法是在接下来的接口使用时全部加上MSXML2::作用域。关于问题的原因,是有关于using namespace的使用,我们vs2005创建项目有加上msxml2.h的头文件,由此发生的冲突。

3. 对于操作接口相关说明和理解。(这段文字来自网络)

可以参考一篇博文,http://blog.csdn.net/perddy/article/details/1756481,里面有对接口整个的解释,这里我们可以点一个点:在DOM 接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,象Documet,Element,Attribute, Text,Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。 NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。

4. 我们代码的目的,操作上面的xml文档,获取相关的一些属性。

CoInitialize(NULL);//初始化COM资源
 
 //IXMLDocumentPtr xmlFile=NULL;
 CComPtr<MSXML2::IXMLDOMDocument> spXmldoc;
 //初始化xmlFile对象
   HRESULT hr=spXmldoc.CoCreateInstance(__uuidof(MSXML2::DOMDocument40));
 CComVariant varXml(_T("D:\\testADOproj\\picturedata.xml"));
 //spXmldoc->put_async(VARIANT_FALSE);//设置为同步
 if(FAILED(hr))
 {
  CString errormess="创建xmlinsatance失败!";
  AfxMessageBox(errormess);
 }
 else 
 {
  try
  {
   spXmldoc->load(varXml);//加载xml
  }
  catch(_com_error e)
  {
   AfxMessageBox(e.ErrorMessage());
   CString errorSee="连接xml出错。";
   AfxMessageBox(errorSee);
  }
 }
 
 MSXML2::IXMLDOMElementPtr ChildNode;
 CString senoname=_T("//Circle");
 ChildNode=(MSXML2::IXMLDOMElementPtr)(spXmldoc->selectSingleNode((_bstr_t)senoname));
 long nCount,iCount;
 //
 MSXML2::IXMLDOMNodeList * xmlchildnodes=NULL;
 ChildNode->get_childNodes(&xmlchildnodes);//获取子元素并且加入到列表
 xmlchildnodes->get_length(&iCount); //获得它的子节点的个数,Circlex下面有两个空元素 ,只是属性值不同
 //targetNode = selectSingleNode("//NodeName[@NodeAtt=‘NodeAttValue‘]")
 //如果子元素不为空
 if (iCount>0)
 {
  MSXML2::IXMLDOMNode *currentNode =NULL;
  MSXML2::IXMLDOMNodePtr preturnNode =NULL;
  for(int i=0;i<iCount;i++)
  {
   xmlchildnodes->get_item(i,&currentNode);
   preturnNode=currentNode->Getattributes()->getNamedItem(_T("radius"));
   _bstr_t temp_radius;
   temp_radius=preturnNode->Gettext();
   addtoItem(temp_radius);
  }
  
 }
//记得要相关释放指针,自己添加
CoUninitialize();//释放COM资源

5. 关于msxml的要注意智能指针的使用。

另外问个问题: IXMLDOMNode *定义指针和IXMLDOMNodePtr 定义有什么不同呢?

暂时写这些,以后在详解。

时间: 2024-08-11 11:38:20

C++操作msxml的学习实例的相关文章

VBS操作JS网页元素实例

'=========================================================================='' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.0'' NAME: '' AUTHOR: Microsoft , Microsoft' DATE : 2014/8/14'' COMMENT: ''==========================

Struts2+Spring+Ibatis用户注册、登录、管理入门学习实例源码下载

原文:Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463735532544.htm Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 项目截图: jar包和sql文件都在源码包中. 运行截图: 用户注册页面: 用户管理页面:

JavaScript字符串常用操作函数之学习笔记

字符串简介 使用英文单引号或双引号括起来,如:’Hello’,”World”,但是不能首尾的单引号和双引号必须一致,交错使用,如果要打印单引号或者双引号,可以使用转义字符\’(单引号),\”(双引号)  代码如下 复制代码 var str_1 = 'Hello World!';  //Hello World!var str_2 = "Hello World!";  //Hello World!var str_3 = '他说:"这样可以的."';  //他说:&quo

JDBC操作数据库的学习(2)

在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本篇就在简单开发中如何对上一篇的例子进行“升级”,满足简单开发中对数据库的增删改查(CRUD). 如果按照上一篇中的例子,那么我们在做增删改查的话将会出现每个方法都要获取连接,释放资源,代码会出现很大的重复性,因此我们应该将每个增删改查每个方法中可以复用的代码抽取出来,同时为了能切换数据库方便,也该将一些配置信

PHP操作XML文件学习笔记

原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作方式很多,这次学习的是通过DOMDocument进行操作,其他的操作方法可以参考 http://www.oschina.net/code/snippet_110138_4727 1.对XML文件的遍历 通过DOMDocument对于XML文件的操作的方法:首先要实例化一个DOMDocument类的对

创建WRAPPER时, SQL20076N 未对指定的操作启用数据库的实例。

您可以通过运行DB2 UPDATE DBM CFG USING FEDERATED YES来设置这个参数.修改这个参数后,必须重新启动实例才会生效(DB2STOP/DB2START).所以你会出现你的 那个错误: 未启动实例 本文说明的是在同一个数据库实例中,在源数据库dbsrc中访问目标库dbtarget的表table1的方法 用户名:usr,密码:pwd db2 版本: UDB FOR AIX 8.2.2 OS: Microsoft Windows XP Professional versi

C#操作session的类实例

本文实例讲述了C#操作session的类.分享给大家供大家参考.具体分析如下: 这个C#类对session操作进行了再次封装,可以大大简化session的常用操作,同时这个类可以将session值设置为数组,也可以将值读取为数组列表,如果你有这方面的需要可以使用这个类,扩这自己对这个C#类进行扩展. using System.Web; namespace DotNet.Utilities { public static class SessionHelper2 { /// <summary>

C#操作CSV文件类实例

本文实例讲述了C#操作CSV文件类.分享给大家供大家参考.具体分析如下: 这个C#类用于转换DataTable为CSV文件.CSV文件转换成DataTable,如果需要进行CSV和DataTable之间进行转换,使用这个类非常合适. using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 /// </summary> public static class

三层架构学习实例

如有雷同,不胜荣欣,如转载,请注明 一.三层架构实例 首先学习三层架构模式­——三层架构实现的留言和查看留言 下面是本人学习三层架构的一点感想和理解,肯定有许多不足的地方,欢迎大家斧正,谢谢,废话到此,下面咱们开始三层架构 大家都知道三层架构分为:1,表示层(UI)2,业务逻辑层(BLL)3,数据访问层(DAL),下面咱们用一个简单的实例,实战三层架构 首先建立一个空白的解决方案,添加如下项目以及文件 1.添加一个ASP.net WebApplication项目,命名为UI,新建WebForm类