主要总结一下MSXML DOM接口的应用。DOM(Document Object Model) 是微软提供的处理XML文档的一个API标准库,我们可以将其理解为一组抽象了XML文档结构的接口。

MSXML的DOM模型是符合W3C DOM标准的,而DOM API在Windows中COM接口的形式提供(所以,使用MSXML时候初始化COM库),关于COM请大家查阅相关资料。简单来说,COM提供了一个环境和一套规则,使接口的设计实现到对象的创建、使用和释放都标准化,从而使COM支持跨平台和跨语言;更重要的是,遵守COM规范使我们代码的接口与实现分离,将程序框架的稳定与扩展统一起来,对于使用COM接口的人则更加简单直观。COM中很重要的概念是refcount,即接口对象的访问计数,通过AddRef和Release两个接口函数来控制。要想用好refcount还是件比较困难的事情,因此我推荐大家使用智能指针。使用智能指针就像使用简单指针一样,我们完全不用去关心指针指向内存空间的释放。

// msxml.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"
#include <iostream>
#include <atlstr.h>#import <MSXML6.dll>  //注意点1:这里要导入dllusing namespace MSXML2;
using namespace std;void msxml2_init()
{::CoInitialize(NULL); //注意点2:必须先初始化COM(应用程序调用com库函数之前,必须初始化com库)
}void msxml2_del()
{::CoUninitialize();   //注意点3:关闭当前线程的COM库。卸载线程加载的所有dll,释放任何其他的资源,关闭在线程上维护所有的RPC连接。
}/* nodename: 要查找的节点的名字
* xmbuf: xml字符串
* 函数功能:查找目标节点的所有属性值
*/
void find_node_attr(char *nodename, char *xmlbuf)
{MSXML2::IXMLDOMDocumentPtr pDoc;HRESULT hr;hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));if(FAILED(hr)){printf("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!\n");return ;}/* 加载xml字符串 */pDoc->loadXML(xmlbuf);MSXML2::IXMLDOMNodePtr pRoot_node, pNode;MSXML2::IXMLDOMNamedNodeMapPtr pAttrs;MSXML2::IXMLDOMNodePtr pAttrItem;long nCount;/* 在树中查找名为Book的节点,"//"表示在任意一层查找 */char tmpnodename[] = "//";strncat(tmpnodename, nodename, );pNode = pDoc->selectSingleNode(tmpnodename);/* get_attributes()来获取该节点的所有属性列表 */pNode->get_attributes(&pAttrs);pAttrs->get_length(&nCount);cout << "共有" << nCount << "个属性值" << nCount << endl;for(int i =  ; i < nCount ; i++){pAttrs->get_item(i, &pAttrItem);/* nodeName, nodeTypedValue得到属性名和属性值 */cout << (_bstr_t)pAttrItem->nodeName << ":" ;cout << (_bstr_t)pAttrItem->nodeTypedValue << endl;}    //使用过了的指针要释放。未使用的指针不要释放,否则会触发中断错误。pDoc.Release();pNode.Release();pAttrs.Release();pAttrItem.Release();
}/*
* 函数功能:遍历整个xml_buf的内容并打印节点名字和节点的属性值
*/
void print_xmlnode(char *xmlbuf)
{    MSXML2::IXMLDOMDocumentPtr pDoc;HRESULT hr;hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));if(FAILED(hr)){printf("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!\n");return ;}/* 加载xml字符串 */pDoc->loadXML(xmlbuf);MSXML2::IXMLDOMNodePtr  pGwsIp_node, pRoot_node, pNode;MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;MSXML2::IXMLDOMNodePtr pAttrItem;/* 遍历整个xml_buf的内容并打印节点名字和节点的属性值 */pRoot_node = pDoc->firstChild;pGwsIp_node = pRoot_node->firstChild;//pDoc->firstChild->firstChild;MSXML2::DOMNodeType nodeType;long nCount ;//节点名称 root下子节点的个数unsigned int num = pRoot_node->childNodes->length;cout << "num = " << num << endl;char node_name[] = {};//Gettext()获取节点值for(int i = ; i < num; i++) {strcpy(node_name, pRoot_node->childNodes->item[i]->Gettext());cout << "node_name = " << node_name << endl;}/*IXMLDOMNamedNodeMap是xml中描述一个结点属性的接口,通过它用户可以对某个节点的属性进行操作*/pGwsIp_node->get_attributes(&pAttrs);pAttrs->get_length(&nCount);for(int i =  ; i < nCount ; i++){pAttrs->get_item(i,&pAttrItem);/*get_nodeName,get_nodeTypedValue得到属性名和属性值*/cout << (_bstr_t)pAttrItem->nodeName << ":" ;cout << (_bstr_t)pAttrItem->nodeTypedValue << endl;}//使用过了的指针要释放。未使用的指针不要释放,否则会触发中断错误。pDoc.Release();pRoot_node.Release();pGwsIp_node.Release();pAttrs.Release();pAttrItem.Release();
}int _tmain(int argc, _TCHAR* argv[])
{msxml2_init();//初始化COM库char buf[] = "<gwsctrl><gws ip=\"192.168.1.24\" emac=\"D4:CA:6D:35:0D:95\" wmac=\"D4:CA:6D:11:59:9F\"/><A>一个节点</A><B>二个节点</B></gwsctrl>";find_node_attr("gws",  buf);print_xmlnode(buf);getchar();msxml2_del();//关闭当前线程的COM库return ;
}

XML文件解析(在Windows环境MFC程序中,使用自带的MSXML6.dll解析)相关推荐

  1. 在MFC程序中增加控制台窗口

    MFC程序中,如果想要输出调试信息,我们一般都是TRACE或者使用LOG文件,都不是很方便,第一个需要我们在调试状态下,第二个也要配置麻烦而且不直观.而使用Console来显示调试信息应该是更好的选择 ...

  2. mfc 内嵌 本地html,MFC程序中内嵌网页,附示例工程

    最近在课程设计,因为小悠太懒了,是在不想用C++完成一些简单的文件上传下载操作,于是就想着将网页内嵌到程序中,上传下载神马的就直接使用网页Web来完成就好了,本示例中将演示在MFC程序中内嵌一个htm ...

  3. DELPHI 开发的 OCX 控件在 MFC 程序中编辑框快捷键不好使的解决

    公司一个大型的项目中使用了 DELPHI 来开发 OCX 控件做数据库的管理,但是GIS图形系统使用 MFC 开发,最后将 OCX 嵌入到 MFC 程序中作为一个完整的系统交付用户使用,但是在使用过程 ...

  4. 屏蔽基于对话框的MFC程序中按下ESC关闭窗口的功能

    在基于对话框的MFC程序中,如果你按下ESC,将会关闭对话框.如何屏蔽这个键呢,其实很简单,只要重载下PreTranslateMessage()即可. 方法:在对话框类上右击,选择"Add ...

  5. 对文件或文件夹进行删除、移动、windows10重命名等操作时,系统可能提示“操作无法完成,因为其中的文件夹已在另一程序中打开,请关闭该文件或文件夹,然后重试

    我们在windows10中对文件或文件夹进行删除.移动.重命名等操作时,系统可能提示"操作无法完成,因为其中的文件夹已在另一程序中打开,请关闭该文件或文件夹,然后重试.",遇到这种 ...

  6. Doxygen 一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件

    Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持PHP.C#.注释的语法与Qt-Doc.KDoc和J ...

  7. 无法删除文件夹的情况:文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开...

    在删除文件夹的时候,可能会遇到文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开,请关闭该文件夹或或文件,然后重试.这类无法关闭删除文件夹的情况,如下图所示. 如何解决 解决这 ...

  8. DevOps进阶(十)Jenkins组包时解决无法删除文件夹的情况:文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开...

    在删除文件夹的时候,可能会遇到文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开,请关闭该文件夹或或文件,然后重试.这类无法关闭删除文件夹的情况,如下图所示. 解决这个的关键是 ...

  9. 电脑删除文件遇到“操作无法完成,因为其中的文件夹或文件已在另一应用程序中打开”怎么办

    原文连接:http://www.xitongcheng.com/jiaocheng/dnrj_article_55055.html 电脑删除无用文件能增加内存使用空间,这不一位小伙伴说自己电脑删除某文 ...

最新文章

  1. 谷歌“验光师”AI算法,让可控核聚变早日成真!
  2. python 笔记 之 sqlalchemy操作数据库-创建表
  3. 外链起到引导、推广排名的作用
  4. Windows 技术篇-Internet Explorer浏览器启用方法,windows找不到ie浏览器解决办法
  5. 网络管理员的爱情,不解释...
  6. hive 中窗口函数row_number,rank,dense_ran,ntile分析函数的用法
  7. 微软dns能做cname吗_为什么域的根不能是CNAME以及有关DNS的其他花絮
  8. JVM初学之类java的类加载器和双亲委派模型
  9. 数据:DOGE近24小时交易额约为107.91亿美元
  10. LeetCode--283--移动0
  11. linux中,使用cat、head、tail命令显示文件指定行
  12. 费马定理中值定理_长盛不衰的法国数学|费马
  13. linux oracle 分号引起大错误
  14. 卷积神经网络+用pytorch构建神经网络
  15. python怎么把小写改成大写_Python 把金额小写转换成大写
  16. C#会员管理系统源码 会员消费管理系统源码
  17. 计算机5级什么水平考试,怎么选择2015计算机等级考试级别
  18. linux查看pci设备枚举,Linux 枚举PCI设备
  19. 华为H3CNE认证题库、教材-热门下载帖汇总!
  20. 三元运算 微信小程序_微信小程序 三元运算符 条件语句if和循环语句for(三目运算+hidden)...

热门文章

  1. 电脑入门必懂的常识7
  2. 最早截止时间有限(EDF)算法、最低松弛度优先(LLF)算法
  3. 第3单元 mvp架构,dagger2,butterknife的使用
  4. java 将A对象的值copy到B对象(根据属性名设置属性值)
  5. c语言倒序输出英文字母表音标,C语言初学问题(分析过程)1) 输出所有的大写英文字母(2) 倒序输出所有大写英文字母(3) 分别输...
  6. 角逐开源云计算下一站 详解EasyStack的“三级火箭”论
  7. Java 中带包的类的编译与运行
  8. 计算机屏幕总闪烁,电脑屏幕总是闪烁怎么解决
  9. R语言lattice包介绍
  10. 「 运动控制 」“关节空间与笛卡尔空间进行轨迹规划”研究