前端之家收集整理的这篇文章主要介绍了
msxml 操作xml,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
1.简介@H_301_2@
@H_301_2@在.NET平台,微软为C#或托管C++程序员提供了丰富的类库,用以支持各种需求,其中就有对XML文件操作的丰富的类。例如XMLDocument,XmlElement等。但是C++标准库中并未提供相应的库。本地开发的C++程序员一般采用开源类库实现对XML文件的操作,例如比较优秀的TinyXML。TinyXML是开源且可以任意免费使用的类库,可以免费用于商业软件中,因此使用者很多。但是在项目中维护第三方类库有时比较麻烦,因此一些开发人员希望避免使用第三方的工具。微软提供的MSXML可以实现对XML文档的相关操作。
2.MSXML 和 DOM
@H_301_2@MSXML全称是Microsoft XML Core Service。MSXML提供的核心功能之一是解析XML文件,并创建DOM树,用户可以通过接口方便的访问DOM树的内容,而不用自己进行内存的维护。如下图所示:
@H_301_2@MSXML是以COM技术提供相关服务,通过CLSID或ProgID创建MSXML对象,因此使用MSXML需要基本的COM知识基础。MSXML有多个版本,最新版是6.0,本文主要使用3.0版本,介绍基本的使用情况。
3.常用接口
IXMLDOMDocument 代表了XML的整个文档。@H_301_2@
IXMLDOMNode各类节点接口的父类。@H_301_2@
IXMLDOMElement代表一个元素对象。继承自IXMLDOMNode@H_301_2@
IXMLDOMAttribute代表一个IXMLDOMElement节点的属性对象,继承自IXMLDOMNode@H_301_2@
4. 示例@H_301_2@
@H_301_2@
- #include"stdafx.h"@H_301_2@
- #include<iostream>@H_301_2@
- #include<objbase.h>@H_301_2@
- #include<msxml2.h>@H_301_2@
- #include<comutil.h>@H_301_2@
-
- #import"msxml3.dll"@H_301_2@
- using@H_301_2@namespace@H_301_2@std;
-
- int@H_301_2@_tmain(int@H_301_2@argc,_TCHAR*argv[])
- {
-
- HRESULT@H_301_2@hr;
- hr=CoInitialize(NULL);
- if@H_301_2@(hr!=S_OK)
- {
- cout<<"InitializeCOMerror."@H_301_2@<<endl;
- return@H_301_2@0;
- }
- //创建Document对象@H_301_2@
- MSXML2::IXMLDOMDocumentPtrpDoc;
- hr=pDoc.CreateInstance("Msxml2.DOMDocument.3.0"@H_301_2@);
- if@H_301_2@(Failed(hr))
- return@H_301_2@0;
- }
- if@H_301_2@(FALSE==pDoc->load(_bstr_t("D:\\Book.xml"@H_301_2@)))
- //输出XML文件所有内容@H_301_2@
- cout<<"-----------Book.xml--------------"@H_301_2@<<endl;
- cout<<pDoc->xml<<endl;
- cout<<"-----------------------------------"@H_301_2@<<endl;
-
- MSXML2::IXMLDOMElementPtrpElem=NULL;
- pElem=pDoc->selectSingleNode("catalog"@H_301_2@);
- if@H_301_2@(pElem==NULL)
- unsignedint@H_301_2@nBookNum=pElem->childNodes->length;
- if@H_301_2@(nBookNum==0)
- cout<<"Theirare"@H_301_2@<<nBookNum<<"bookitemsinBook.xmlfile."@H_301_2@<<endl;
- for@H_301_2@(int@H_301_2@i=0;i<nBookNum;i++)
- MSXML2::IXMLDOMNodePtrpBookNode=pElem->childNodes->item[i];
- if@H_301_2@(pBookNode==NULL)
- //读取book节点的id属性@H_301_2@
- MSXML2::IXMLDOMNodePtrpId=pBookNode->attributes->getNamedItem("id"@H_301_2@);
- cout<<"BookID:"@H_301_2@<<pId->text<<"\t"@H_301_2@;
- //读取book节点下author子节点@H_301_2@
- MSXML2::IXMLDOMNodePtrpAuthorNode=pBookNode->selectSingleNode("author"@H_301_2@);
- if@H_301_2@(pAuthorNode==NULL)
- cout<<"Author:Error\t"@H_301_2@;
- else@H_301_2@
- cout<<"Author:"@H_301_2@<<pAuthorNode->text<<"\t"@H_301_2@;
- cout<<endl;
- <SPANstyle="WHITE-SPACE:pre"@H_301_2@>CoUninitialize();</SPAN>
- }