首页 / XML / 【转】msxml 操作xml
【转】msxml 操作xml
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【转】msxml 操作xml,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2832字,纯文字阅读大概需要5分钟。
内容图文
转自http://blog.csdn.net/dai_jing/article/details/8393392,原始出处不详。
1.简介
在.NET平台,微软为C#或托管C++程序员提供了丰富的类库,用以支持各种需求,其中就有对XML文件操作的丰富的类。例如XMLDocument, XmlElement等。但是C++标准库中并未提供相应的库。本地开发的C++程序员一般采用开源类库实现对XML文件的操作,例如比较优秀的TinyXML。TinyXML是开源且可以任意免费使用的类库,可以免费用于商业软件中,因此使用者很多。但是在项目中维护第三方类库有时比较麻烦,因此一些开发人员希望避免使用第三方的工具。微软提供的MSXML可以实现对XML文档的相关操作。
2.MSXML 和 DOM
MSXML全称是Microsoft XML Core Service。MSXML提供的核心功能之一是解析XML文件,并创建DOM树,用户可以通过接口方便的访问DOM树的内容,而不用自己进行内存的维护。如下图所示:
MSXML是以COM技术提供相关服务,通过CLSID或ProgID创建MSXML对象,因此使用MSXML需要基本的COM知识基础。MSXML有多个版本,最新版是6.0,本文主要使用3.0版本,介绍基本的使用情况。
3.常用接口
IXMLDOMDocument 代表了XML的整个文档。
IXMLDOMNode各类节点接口的父类。
IXMLDOMElement代表一个元素对象。继承自IXMLDOMNode
IXMLDOMAttribute代表一个IXMLDOMElement节点的属性对象,继承自IXMLDOMNode
4. 示例
#include "stdafx.h" #include<iostream> #include<objbase.h> #include<msxml2.h> #include<comutil.h> #import "msxml3.dll"usingnamespace std; int _tmain(int argc, _TCHAR* argv[]) { //首先初始化COM HRESULT hr; hr = CoInitialize(NULL); if( hr != S_OK ) { cout<<"Initialize COM error."<<endl; return0; } //创建Document对象 MSXML2::IXMLDOMDocumentPtr pDoc; hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0"); if( FAILED(hr) ) { return0; } if( FALSE == pDoc->load(_bstr_t("D:\\Book.xml")) ) return0; //输出XML文件所有内容 cout<<"----------- Book.xml --------------"<<endl; cout<<pDoc->xml<<endl; cout<<"-----------------------------------"<<endl; //选择内容的根节点 MSXML2::IXMLDOMElementPtr pElem = NULL; pElem = pDoc->selectSingleNode("catalog"); if(pElem==NULL) return0; unsigned int nBookNum = pElem->childNodes->length; if( nBookNum == 0) return0; cout <<"Their are "<< nBookNum << " book items in Book.xml file."<<endl; for(int i=0; i < nBookNum; i++) { MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i]; if(pBookNode==NULL) return0; //读取book节点的id属性 MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("id"); cout<<"Book ID: "<<pId->text<<"\t"; //读取book节点下author子节点 MSXML2::IXMLDOMNodePtr pAuthorNode = pBookNode->selectSingleNode("author"); if(pAuthorNode==NULL) { cout<<"Author: Error\t"; } else { cout<<"Author: "<< pAuthorNode->text<< "\t"; } cout<<endl; } CoUninitialize(); return0; }
输出结果:
5. COM智能指针
在示例代码中,我们看到使用了IXMLDOMElementPtr , IXMLDOMNodePtr 等智能指针,在MSDN中,并不能查到关于IXMLDOMElementPtr的信息,而只有IXMLDOMElement,实际上后缀带有Ptr的是对应的COM接口的智能指针。在msxml3.tlh中,可以找到如下定义:
_COM_SMARTPTR_TYPEDEF(IXMLDOMElement, __uuidof(IXMLDOMElement));
_COM_SMARTPTR_TYPEDEF宏用于定义一个_com_ptr_t 对象,_com_ptr_t封装了COM接口,称之为智能指针,该模板类用于负责资源的分配和释放,内部调用QueryInterface,AddRef,Release等IUnknown的函数。避免了编程人员对这些繁琐的操作一一处理。
对上述宏展开后,就定义了智能指针 IXMLDOMElementPtr,其封装了IXMLDOMElement接口。
原文:http://www.cnblogs.com/xiaoyusmile/p/3920075.html
内容总结
以上是互联网集市为您收集整理的【转】msxml 操作xml全部内容,希望文章能够帮你解决【转】msxml 操作xml所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。