MFC使用自带的MSXML6.dll解析xml(开发环境vc2010)
2024-09-28 06:01:09
程序是win32控制台程序
// msxml.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h"
#include <iostream>
#include <atlstr.h>
#import <MSXML6.dll>
using namespace MSXML2;
using namespace std; void msxml2_init()
{
::CoInitialize(NULL);
} void msxml2_del()
{
::CoUninitialize();
}
/* 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(); 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();
return ;
}
运行后的效果
最新文章
- Access-Control-Allow-Origin与跨域问题
- animation-fill-mode的一些思考
- JAVASCRIPT实现简单计算器
- 在MySql 5.0 的表里同时添加两个自动更新的timestamp字段
- Vim配置及说明——IDE编程环境
- Hbase之测试数据
- 【架构】生成全局唯一ID的3个思路,来自一个资深架构师的总结
- Shell_Oracle Erp基于主机文件Host开发详解(案例)
- Objc基础学习记录5
- 一款基于jQuery饼状图比例分布数据报表
- Subline Text默认设置文件Preferences.sublime-settings—Default详解
- android87 Service
- Android自定义控件实战——水流波动效果的实现WaveView
- 微信小程序之----加载中提示框loading
- foreach循环中为什么不要进行remove/add操作
- KVM的安装使用
- iview库表table组件内嵌套Select组件
- git 常用操作,下拉,提交,更新,还原
- CIFS 与 SMB 有什么区别?
- MongoDB 和 NoSQL简介
热门文章
- Linux下判断字符串长度
- Chrome DevTools 代码覆盖率功能详解
- Install and Enable Telnet server in Ubuntu Linux
- nginx+php-fpm页面显示空白的解决方法
- iOS:Masonry 英文原档介绍
- vue-resource基本使用方法
- 常见Hibernate报错处理:出现“org.hibernate.QueryException: could not resolve property”和 is not mapped和could not locate named parameter错误的解决
- 实现一个Cglib代理Demo
- Excel 对应.xml/.ftl 配置(中爆导出范文)
- 安装Python的机器学习包Sklearn 出错解决方法