首页 > 代码库 > C++操作msxml的学习实例
C++操作msxml的学习实例
最近工作上的需要,需要使用C++来与xml进行交互,在学习的过程中遇到了一些问题,从网上也搜索了一些资料,在这里总结一下,既是对初学的梳理,也能方便大家需要接触的人。
对xml的认识。
xml是一种相对规范严整的解释语言。具体的语法大家可以去查,对我们使用的角度来说,我们只需要了解,他有很多节点(元素)组成,从父元素到其子元素,子元素可以为空,资源拥有属性,可以方便存储数据。以下是一个xml的示例文档:
<?xml version ="1.0" encoding="UTF-8"?> <Picture> <Circle> <circle name="circle1" radius="12.5"/> <circle name="circle2" radius="56.5"/> </Circle> <Rectangle> <rectangle name ="rectangle1" rec_long="20.5" rec_weight="15"/> <rectangle name ="rectangle1" rec_long="40" rec_weight="25"/> <rectangle name ="rectangle1" rec_long="60" rec_weight="45"/> </Rectangle> </Picture>
2.本实例使用的准备工作
我们使用的平台是VS2005,使用msxml4,使用前准备工作如下:
下载安装msxml4;
利用VS2005新建一个项目,我这里使用的是对话框的项目。这里面使用了一个树的控件(TreeControl)
在项目的stdafx.h头文件最后添上语句:
#import "msxml4.dll"
using namespace MSXML2;我在这里的时候遇到一个问题:在使用接口时总是报出“error:XX函数:不能确定的符号”,这就让我很迷惑,即使我新插入的msxml4.dll可能有冲突,怎么还会报错呢?况且我还使用了using namespace MSXML2的语句。问题的解决办法是在接下来的接口使用时全部加上MSXML2::作用域。关于问题的原因,是有关于using namespace的使用,我们vs2005创建项目有加上msxml2.h的头文件,由此发生的冲突。
3. 对于操作接口相关说明和理解。(这段文字来自网络)
可以参考一篇博文,http://blog.csdn.net/perddy/article/details/1756481,里面有对接口整个的解释,这里我们可以点一个点:在DOM 接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,象Documet,Element,Attribute, Text,Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。 NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。
4. 我们代码的目的,操作上面的xml文档,获取相关的一些属性。
CoInitialize(NULL);//初始化COM资源 //IXMLDocumentPtr xmlFile=NULL; CComPtr<MSXML2::IXMLDOMDocument> spXmldoc; //初始化xmlFile对象 HRESULT hr=spXmldoc.CoCreateInstance(__uuidof(MSXML2::DOMDocument40)); CComVariant varXml(_T("D:\\testADOproj\\picturedata.xml")); //spXmldoc->put_async(VARIANT_FALSE);//设置为同步 if(FAILED(hr)) { CString errormess="创建xmlinsatance失败!"; AfxMessageBox(errormess); } else { try { spXmldoc->load(varXml);//加载xml } catch(_com_error e) { AfxMessageBox(e.ErrorMessage()); CString errorSee="连接xml出错。"; AfxMessageBox(errorSee); } } MSXML2::IXMLDOMElementPtr ChildNode; CString senoname=_T("//Circle"); ChildNode=(MSXML2::IXMLDOMElementPtr)(spXmldoc->selectSingleNode((_bstr_t)senoname)); long nCount,iCount; // MSXML2::IXMLDOMNodeList * xmlchildnodes=NULL; ChildNode->get_childNodes(&xmlchildnodes);//获取子元素并且加入到列表 xmlchildnodes->get_length(&iCount); //获得它的子节点的个数,Circlex下面有两个空元素 ,只是属性值不同 //targetNode = selectSingleNode("//NodeName[@NodeAtt=‘NodeAttValue‘]") //如果子元素不为空 if (iCount>0) { MSXML2::IXMLDOMNode *currentNode =NULL; MSXML2::IXMLDOMNodePtr preturnNode =NULL; for(int i=0;i<iCount;i++) { xmlchildnodes->get_item(i,¤tNode); preturnNode=currentNode->Getattributes()->getNamedItem(_T("radius")); _bstr_t temp_radius; temp_radius=preturnNode->Gettext(); addtoItem(temp_radius); } } //记得要相关释放指针,自己添加 CoUninitialize();//释放COM资源
5. 关于msxml的要注意智能指针的使用。
另外问个问题: IXMLDOMNode *定义指针和IXMLDOMNodePtr 定义有什么不同呢?
暂时写这些,以后在详解。
本文出自 “技术不止步” 博客,请务必保留此出处http://3994129.blog.51cto.com/3984129/1575151
C++操作msxml的学习实例