VC++中操作XMLWin32实例

来源:互联网 发布:连接不上魔法学园网络 编辑:程序博客网 时间:2024/06/06 03:32

VC++中操作XML 

XMLWin32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用iniVC++里操作XML有两个库可以用:MSXMLXmlLiteMSXML又细分了两种接口:DOMSAX2XP没自带有XmlLite,只自带有2.x3.x版的MSXML,不支持SAX2(需要MSXML 4.0以上),所以优先使用DOM
DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:
1MFC里用CComPtr调用
2SDK里直接调用DOM接口
3SDK里用智能指针调用
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后续再做补充。

0 0
原创粉丝点击