博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC使用自带的MSXML6.dll解析xml(开发环境vc2010)
阅读量:5152 次
发布时间:2019-06-13

本文共 3364 字,大约阅读时间需要 11 分钟。

程序是win32控制台程序

// msxml.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include 
#include
#import
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[20] = "//"; strncat(tmpnodename, nodename, 3); pNode = pDoc->selectSingleNode(tmpnodename); /* get_attributes()来获取该节点的所有属性列表 */ pNode->get_attributes(&pAttrs); pAttrs->get_length(&nCount); cout << "共有" << nCount << "个属性值" << nCount << endl; for(int i = 0 ; 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[20] = {}; //Gettext()获取节点值 for(int i = 0; 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 = 0 ; 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[300] = "
一个节点
二个节点
"; find_node_attr("gws", buf); print_xmlnode(buf); getchar(); msxml2_del(); return 0;}

 

运行后的效果

转载于:https://www.cnblogs.com/Genesis-007/p/5652610.html

你可能感兴趣的文章
Java网络编程--socket服务器端与客户端讲解
查看>>
List_统计输入数值的各种值
查看>>
学习笔记-KMP算法
查看>>
Timer-triggered memory-to-memory DMA transfer demonstrator
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>
64位主机64位oracle下装32位客户端ODAC(NFPACS版)
查看>>
获取国内随机IP的函数
查看>>
今天第一次写博客
查看>>
江城子·己亥年戊辰月丁丑日话凄凉
查看>>
IP V4 和 IP V6 初识
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
(转)matlab练习程序(HOG方向梯度直方图)
查看>>
『Raid 平面最近点对』
查看>>
【ADO.NET基础-数据加密】第一篇(加密解密篇)
查看>>
C语言基础小结(一)
查看>>
STL中的优先级队列priority_queue
查看>>
UE4 使用UGM制作血条
查看>>
浏览器对属性兼容性支持力度查询网址
查看>>
OO学习总结与体会
查看>>