如何操作vc++中的mfc [exe]

 我来答
匿名用户
2016-06-12
展开全部
XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini。VC++里操作XML有两个库可以用:MSXML和XmlLite。MSXML又细分了两种接口:DOM和SAX2。XP没自带有XmlLite,只自带有2.x、3.x版的MSXML,不支持SAX2(需要MSXML4.0以上),所以优先使用DOM。DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:1、MFC里用CComPtr调用2、SDK里直接调用DOM接口3、SDK里用智能指针调用这3种方法本质上是一样的,区别只不过在于需要编码的多少而已,用CComPtr可以极大的简化代码,下面是几个例子。例子stocks.xml:text1childtext1这个例子应该包含了XML最常见的特征了吧?MFCMFC里可以直接使用DOM,不需要手动添加额外的头文件,只需要在CWinApp::InitInstance()里调用CoInitialize(NULL)初始化COM,在CWinApp::ExitInstance里调用CoUninitialize()释放COM就行了。//读取XMLCComPtrspDoc;//DOMspDoc.CoCreateInstance(CLSID_DOMDocument);VARIANT_BOOLvb;spDoc->load(CComVariant(OLESTR("stocks.xml")),&vb);//加载XML文件CComPtrspRootEle;spDoc->get_documentElement(&spRootEle);//根节点CComPtrspNodeList;spRootEle->get_childNodes(&spNodeList);//子节点列表longnLen;spNodeList->get_length(&nLen);//子节点数for(longi=0;i!=nLen;++i)//遍历子节点{CComPtrspNode;spNodeList->get_item(i,&spNode);ProcessNode(spNode);//节点处理函数}//写入XMLCComPtrspNode;spRootEle->selectSingleNode(OLESTR("/root/node1"),&spNode);spNode->put_text(OLESTR("newText"));//写入textspRootEle->selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"),&spNode);spNode->put_nodeValue(CComVariant(OLESTR("newValue")));//写入valueCComPtrspNewNode;spDoc->createNode(CComVariant(NODE_ELEMENT),OLESTR("childnode3"),OLESTR(""),&spNewNode);//创建新节点spRootEle->selectSingleNode(OLESTR("/root/node2"),&spNode);spNode->appendChild(spNewNode,&spNewNode);//将新节点加为node2的子节点spNewNode->put_text(OLESTR("childtext2"));//写入新节点textCComQIPtrspEle=spNewNode;//注意这里使用CComQIPtrspEle->setAttribute(OLESTR("attrib1"),CComVariant(OLESTR("value1")));//给新节点添加属性spDoc->save(CComVariant(OLESTR("stocks.xml")));//节点处理函数voidProcessNode(CComPtr&spNode){CComBSTRbsNodeName;spNode->get_nodeName(&bsNodeName);//节点名AfxMessageBox(COLE2CT(bsNodeName));CComVariantvarVal;spNode->get_nodeValue(&varVal);//节点值AfxMessageBox(COLE2CT(varVal.bstrVal));DOMNodeTypeeNodeType;spNode->get_nodeType(&eNodeType);if(eNodeType==NODE_ELEMENT)//只有NODE_ELEMENT类型才能包含有属性和子节点{//递归遍历节点属性CComPtrspNameNodeMap;spNode->get_attributes(&spNameNodeMap);longnLength;spNameNodeMap->get_length(&nLength);for(longi=0;i!=nLength;++i){CComPtrspNodeAttrib;//注意属性也是一个IXMLDOMNodespNameNodeMap->get_item(i,&spNodeAttrib);ProcessNode(spNodeAttrib);}//递归遍历子节点CComPtrspNodeList;spNode->get_childNodes(&spNodeList);spNodeList->get_length(&nLength);for(longi=0;i!=nLength;++i){CComPtrspChildNode;spNodeList->get_item(i,&spChildNode);ProcessNode(spChildNode);}}}对于text这样的节点,get_nodeValue会得到空,要得到"text"的话可以遍历子节点(只有一个子节点,它的nodeName为"#text",nodeType为NODE_TEXT,nodeValue就是"text");也可以用get_text直接得到"text",但是对于这样的节点textchildtext,get_text会同时得到"text"和"childtext",不过这样的节点应该是不允许的。DOM里使用的字符串(BSTR)都是OLESTR类型,默认情况下OLESTR是Unicode字符,MFC里可以用COLE2CT把LPCOLESTR转换为LPCTSTR。对于自己定义的XML,大多数时候不需要遍历,可以通过调用selectNodes、selectSingleNode指定XPath直接读取某个节点或属性:CComPtrspDoc;//DOMspDoc.CoCreateInstance(CLSID_DOMDocument);VARIANT_BOOLvb;spDoc->load(CComVariant(OLESTR("stocks.xml")),&vb);//加载XML文件CComPtrspRootEle;spDoc->get_documentElement(&spRootEle);//根节点CComPtrspNodeList;CComPtrspNode;spRootEle->selectNodes(OLESTR("/root/node2/*"),&spNodeList);//得到node2下的所有子节点spRootEle->selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"),&spNode);//得到childnode1的attrib1属性XPath的语法可以参考XML文档或MSDN。SDKSDK中也可以使用智能指针,和MFC没太大区别,同样很方便,直接给代码:#include#include#import//节点处理函数voidProcessNode(MSXML2::IXMLDOMNodePtrspNode){std::coutnodeName;if(spNode->nodeType==NODE_ATTRIBUTE||spNode->nodeType==NODE_TEXT)std::coutnodeValue);std::coutnodeType==NODE_ELEMENT){MSXML2::IXMLDOMNamedNodeMapPtrspNameNodeMap=spNode->attributes;for(longi=0;i!=spNameNodeMap->length;++i)//遍历节点属性ProcessNode(spNameNodeMap->item);MSXML2::IXMLDOMNodeListPtrspNodeList=spNode->childNodes;for(longi=0;i!=spNodeList->length;++i)//遍历子节点ProcessNode(spNodeList->item);}}int_tmain(intargc,_TCHAR*argv[]){CoInitialize(NULL);//读取XMLMSXML2::IXMLDOMDocumentPtrspXMLDoc;spXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));spXMLDoc->load(L"stocks.xml");MSXML2::IXMLDOMElementPtrspRoot=spXMLDoc->documentElement;//根节点MSXML2::IXMLDOMNodeListPtrspNodeList=spRoot->childNodes;for(longi=0;i!=spNodeList->length;++i)//遍历子节点ProcessNode(spNodeList->item);//写入XMLspRoot->selectSingleNode(L"/root/node1")->text=L"newText";spRoot->selectSingleNode(L"/root/node2/childnode1/@attrib1")->nodeValue=L"newValue";MSXML2::IXMLDOMNodePtrspNewNode=spRoot->selectSingleNode(L"/root/node2")->appendChild(spXMLDoc->createNode(_variant_t(NODE_ELEMENT),L"childnode3",L""));//给node2创建新子节点childnode3spNewNode->text=L"childtext2";MSXML2::IXMLDOMElementPtrspEle=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");return0;}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式