VC++中操作XMLWin32实例
来源:互联网 发布:连接不上魔法学园网络 编辑:程序博客网 时间:2024/06/06 03:32
VC++中操作XML
XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini。VC++里操作XML有两个库可以用:MSXML和XmlLite。MSXML又细分了两种接口:DOM和SAX2。XP没自带有XmlLite,只自带有2.x、3.x版的MSXML,不支持SAX2(需要MSXML 4.0以上),所以优先使用DOM。
DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:
1、MFC里用CComPtr调用
2、SDK里直接调用DOM接口
3、SDK里用智能指针调用
这3种方法本质上是一样的,区别只不过在于需要编码的多少而已,用CComPtr可以极大的简化代码,下面是几个例子。
例子stocks.xml:
<?xml version="1.0" encoding="utf-8"?>
<root>
<node1>text1</node1>
<node2>
<childnode1 attrib1="value1" attrib2="value2"/>
<childnode2 attrib1="value1" attrib2="value2">childtext1</childnode2>
</node2>
</root>
这个例子应该包含了XML最常见的特征了吧?
SDK读取XML
SDK中也可以使用智能指针,和MFC没太大区别,同样很方便。通过Win32 console程序实现方式如下:新建一个stocks.xml文件,包含上面上面的内容。将这个文件存放于工程当前目录中。直接给代码:
// XMLtest32.cpp : 定义控制台应用程序的入口点#include "stdafx.h" #include <iostream>#include <tchar.h>#import <msxml3.dll> //节点处理函数void ProcessNode(MSXML2::IXMLDOMNodePtr spNode){std::cout << "nodeName: " << spNode->nodeName;if (spNode->nodeType == NODE_ATTRIBUTE || spNode->nodeType == NODE_TEXT)std::cout << "\tnodeValue: " << _bstr_t(spNode->nodeValue);std::cout << std::endl;if (spNode->nodeType == NODE_ELEMENT){MSXML2::IXMLDOMNamedNodeMapPtr spNameNodeMap = spNode->attributes;for (long i = 0; i != spNameNodeMap->length; ++i) //遍历节点属性ProcessNode(spNameNodeMap->item[i]);MSXML2::IXMLDOMNodeListPtr spNodeList = spNode->childNodes;for (long i = 0; i != spNodeList->length; ++i) //遍历子节点ProcessNode(spNodeList->item[i]);}} int _tmain(int argc, _TCHAR* argv[]){CoInitialize(NULL);//读取XMLMSXML2::IXMLDOMDocumentPtr spXMLDoc;spXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));spXMLDoc->load(L"stocks.xml");MSXML2::IXMLDOMElementPtr spRoot = spXMLDoc->documentElement; //根节点MSXML2::IXMLDOMNodeListPtr spNodeList = spRoot->childNodes;for (long i = 0; i != spNodeList->length; ++i) //遍历子节点ProcessNode(spNodeList->item[i]);//写入XMLspRoot->selectSingleNode(L"/root/node1")->text = L"newText";spRoot->selectSingleNode(L"/root/node2/childnode1/@attrib1")->nodeValue = L"newValue";MSXML2::IXMLDOMNodePtr spNewNode = spRoot->selectSingleNode(L"/root/node2")->appendChild(spXMLDoc->createNode(_variant_t(NODE_ELEMENT), L"childnode3", L"")); //给node2创建新子节点childnode3spNewNode->text = L"childtext2";MSXML2::IXMLDOMElementPtr spEle = spNewNode;spEle->setAttribute(L"attrib1", _variant_t(L"value1")); //添加新属性
spXMLDoc->save(_variant_t(L"stocks.xml"));spNewNode.Release();
spEle.Release();spNodeList.Release();
spRoot.Release();
spXMLDoc.Release();
CoUninitialize();system("pause");return 0;}
程序运行结果:
MFC中操作XML后续再做补充。
- VC++中操作XMLWin32实例
- VC 时间操作实例
- VC操作EXCEL实例
- VC操作XML编程实例
- VC操作XML编程实例
- VC操作XML编程实例
- VC++操作word实例详解
- vc++注册表简单操作实例
- VC操作word实例详解
- VC操作word实例详解
- VC++中状态栏操作
- vc中操作WORD
- VC++中操作word
- VC中操作文件
- VC中操作excel
- vc中操作Xml
- VC中TabCtrl用法实例
- VC中TabCtrl用法实例
- 第十四周--多态性、虚函数和抽象类(5)
- Android应用程序apk内xml文件编码解析
- 总结篇:数组中N(n=1,2,3)个只出现一次的数字[find N numbers which appear only once in array]
- 【16】C++实现单例模式
- 有依赖的背包问题(背包九讲)
- VC++中操作XMLWin32实例
- Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
- Spring IOC--Bean的装配(使用注解定义Bean)
- wait(),notify()和锁
- 数组名和指针的区别
- Android获取API level
- 我的Android开发相关文章
- POJ 3356 AGTC LCS变形题
- 分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]