msxml 操作xml
来源:互联网 发布:孩子沉迷网络怎么办 编辑:程序博客网 时间:2024/05/21 06:35
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"
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- //首先初始化COM
- HRESULT hr;
- hr = CoInitialize(NULL);
- if( hr != S_OK )
- {
- cout<<"Initialize COM error."<<endl;
- return 0;
- }
- //创建Document对象
- MSXML2::IXMLDOMDocumentPtr pDoc;
- hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0");
- if( FAILED(hr) )
- {
- return 0;
- }
- if( FALSE == pDoc->load(_bstr_t("D:\\Book.xml")) )
- return 0;
- //输出XML文件所有内容
- cout<<"----------- Book.xml --------------"<<endl;
- cout<<pDoc->xml<<endl;
- cout<<"-----------------------------------"<<endl;
- //选择内容的根节点
- MSXML2::IXMLDOMElementPtr pElem = NULL;
- pElem = pDoc->selectSingleNode("catalog");
- if(pElem==NULL)
- return 0;
- unsigned int nBookNum = pElem->childNodes->length;
- if( nBookNum == 0)
- return 0;
- 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)
- return 0;
- //读取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;
- }
- <SPAN style="WHITE-SPACE: pre"> CoUninitialize();</SPAN>
- return 0;
- }
#include "stdafx.h"#include<iostream>#include<objbase.h>#include<msxml2.h>#include<comutil.h> #import "msxml3.dll"using namespace std;int _tmain(int argc, _TCHAR* argv[]){//首先初始化COMHRESULT hr;hr = CoInitialize(NULL); if( hr != S_OK ){cout<<"Initialize COM error."<<endl;return 0;}//创建Document对象MSXML2::IXMLDOMDocumentPtr pDoc;hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0");if( FAILED(hr) ){return 0;}if( FALSE == pDoc->load(_bstr_t("D:\\Book.xml")) )return 0;//输出XML文件所有内容cout<<"----------- Book.xml --------------"<<endl;cout<<pDoc->xml<<endl;cout<<"-----------------------------------"<<endl;//选择内容的根节点MSXML2::IXMLDOMElementPtr pElem = NULL;pElem = pDoc->selectSingleNode("catalog");if(pElem==NULL)return 0;unsigned int nBookNum = pElem->childNodes->length;if( nBookNum == 0)return 0;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)return 0;//读取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();return 0;}
输出结果:
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接口。
- msxml 操作xml
- msxml 操作xml
- msXML DOM操作XML文档
- vc中通过MSXML操作XML文件
- MSXML操作XML的完整例子
- vc中通过MSXML操作XML文件
- VC6 使用msxml 操作xml 文档
- 使用MSXML进行基本的XML操作
- vc中通过MSXML操作XML文件
- vc中通过MSXML操作XML文件(转贴)
- C++ 操作XML的完整例子——MSXML篇
- C++ 操作XML的完整例子——MSXML篇
- MSXML 解析 XML(收藏)
- MSXML 解析 XML
- MSXML 解析 XML
- 用MSXML解析XML
- MSXML 解析 XML
- 使用MsXML存取XML
- struts2跟struts1的区别
- 使用SSH集成框架开发项目步骤
- java GUI编程小技巧
- win7下如何建立ftp服务器
- 开机就是linux图形界面,怎么进入控制台,输命令? shell
- msxml 操作xml
- MyEclipse for Spring 10.6设置编码方式
- 可等待的计时器内核对象
- ofbiz controller.xml 文件
- hibernate的搭建(包括Spring集成)和调用
- VisualSVN Server的配置和使用方法
- 说与做
- UESTC 1558 Charitable Exchange
- 创建和遍历单向线性链表(C)