msxml 操作xml

前端之家收集整理的这篇文章主要介绍了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@

  1. #include"stdafx.h"@H_301_2@
  2. #include<iostream>@H_301_2@
  3. #include<objbase.h>@H_301_2@
  4. #include<msxml2.h>@H_301_2@
  5. #include<comutil.h>@H_301_2@
  6. #import"msxml3.dll"@H_301_2@
  7. using@H_301_2@namespace@H_301_2@std;
  8. int@H_301_2@_tmain(int@H_301_2@argc,_TCHAR*argv[])
  9. {
  10. //首先初始化COM@H_301_2@
  11. HRESULT@H_301_2@hr;
  12. hr=CoInitialize(NULL);
  13. if@H_301_2@(hr!=S_OK)
  14. {
  15. cout<<"InitializeCOMerror."@H_301_2@<<endl;
  16. return@H_301_2@0;
  17. }
  18. //创建Document对象@H_301_2@
  19. MSXML2::IXMLDOMDocumentPtrpDoc;
  20. hr=pDoc.CreateInstance("Msxml2.DOMDocument.3.0"@H_301_2@);
  21. if@H_301_2@(Failed(hr))
  22. return@H_301_2@0;
  23. }
  24. if@H_301_2@(FALSE==pDoc->load(_bstr_t("D:\\Book.xml"@H_301_2@)))
  25. //输出XML文件所有内容@H_301_2@
  26. cout<<"-----------Book.xml--------------"@H_301_2@<<endl;
  27. cout<<pDoc->xml<<endl;
  28. cout<<"-----------------------------------"@H_301_2@<<endl;
  29. //选择内容的根节点@H_301_2@
  30. MSXML2::IXMLDOMElementPtrpElem=NULL;
  31. pElem=pDoc->selectSingleNode("catalog"@H_301_2@);
  32. if@H_301_2@(pElem==NULL)
  33. unsignedint@H_301_2@nBookNum=pElem->childNodes->length;
  34. if@H_301_2@(nBookNum==0)
  35. cout<<"Theirare"@H_301_2@<<nBookNum<<"bookitemsinBook.xmlfile."@H_301_2@<<endl;
  36. for@H_301_2@(int@H_301_2@i=0;i<nBookNum;i++)
  37. MSXML2::IXMLDOMNodePtrpBookNode=pElem->childNodes->item[i];
  38. if@H_301_2@(pBookNode==NULL)
  39. //读取book节点的id属性@H_301_2@
  40. MSXML2::IXMLDOMNodePtrpId=pBookNode->attributes->getNamedItem("id"@H_301_2@);
  41. cout<<"BookID:"@H_301_2@<<pId->text<<"\t"@H_301_2@;
  42. //读取book节点下author子节点@H_301_2@
  43. MSXML2::IXMLDOMNodePtrpAuthorNode=pBookNode->selectSingleNode("author"@H_301_2@);
  44. if@H_301_2@(pAuthorNode==NULL)
  45. cout<<"Author:Error\t"@H_301_2@;
  46. else@H_301_2@
  47. cout<<"Author:"@H_301_2@<<pAuthorNode->text<<"\t"@H_301_2@;
  48. cout<<endl;
  49. <SPANstyle="WHITE-SPACE:pre"@H_301_2@>CoUninitialize();</SPAN>
  50. }
    #include"stdafx.h"@H_301_2@@H_301_2@@H_301_2@
  1. #include<iostream>@H_301_2@@H_301_2@@H_301_2@
  2. #include<objbase.h>@H_301_2@@H_301_2@@H_301_2@
  3. #include<msxml2.h>@H_301_2@@H_301_2@@H_301_2@
  4. #include<comutil.h>@H_301_2@@H_301_2@@H_301_2@
  5. @H_301_2@
  6. #import"msxml3.dll"@H_301_2@@H_301_2@@H_301_2@
  7. using@H_301_2@@H_301_2@namespace@H_301_2@std;@H_301_2@@H_301_2@
  8. @H_301_2@
  9. int@H_301_2@_tmain(@H_301_2@int@H_301_2@argc,_TCHAR*argv[])@H_301_2@@H_301_2@
  10. {@H_301_2@
  11. //首先初始化COM@H_301_2@@H_301_2@@H_301_2@
  12. HRESULT@H_301_2@hr;@H_301_2@@H_301_2@
  13. hr=CoInitialize(NULL);@H_301_2@
  14. if@H_301_2@(hr!=S_OK)@H_301_2@@H_301_2@
  15. {@H_301_2@
  16. cout<<"InitializeCOMerror."@H_301_2@<<endl;@H_301_2@@H_301_2@
  17. return@H_301_2@0;@H_301_2@@H_301_2@
  18. }@H_301_2@
  19. //创建Document对象@H_301_2@@H_301_2@@H_301_2@
  20. MSXML2::IXMLDOMDocumentPtrpDoc;@H_301_2@
  21. hr=pDoc.CreateInstance("Msxml2.DOMDocument.3.0"@H_301_2@);@H_301_2@@H_301_2@
  22. if@H_301_2@(Failed(hr))@H_301_2@@H_301_2@
  23. return@H_301_2@0;@H_301_2@@H_301_2@
  24. }@H_301_2@
  25. if@H_301_2@(FALSE==pDoc->load(_bstr_t(@H_301_2@"D:\\Book.xml"@H_301_2@)))@H_301_2@@H_301_2@
  26. //输出XML文件所有内容@H_301_2@@H_301_2@@H_301_2@
  27. cout<<"-----------Book.xml--------------"@H_301_2@<<endl;@H_301_2@@H_301_2@
  28. cout<<pDoc->xml<<endl;@H_301_2@
  29. cout<<"-----------------------------------"@H_301_2@<<endl;@H_301_2@@H_301_2@
  30. //选择内容的根节点@H_301_2@@H_301_2@@H_301_2@
  31. MSXML2::IXMLDOMElementPtrpElem=NULL;@H_301_2@
  32. pElem=pDoc->selectSingleNode("catalog"@H_301_2@);@H_301_2@@H_301_2@
  33. if@H_301_2@(pElem==NULL)@H_301_2@@H_301_2@
  34. unsignedint@H_301_2@nBookNum=pElem->childNodes->length;@H_301_2@@H_301_2@
  35. if@H_301_2@(nBookNum==0)@H_301_2@@H_301_2@
  36. cout<<"Theirare"@H_301_2@<<nBookNum<<@H_301_2@"bookitemsinBook.xmlfile."@H_301_2@<<endl;@H_301_2@@H_301_2@
  37. for@H_301_2@(@H_301_2@int@H_301_2@i=0;i<nBookNum;i++)@H_301_2@@H_301_2@
  38. MSXML2::IXMLDOMNodePtrpBookNode=pElem->childNodes->item[i];@H_301_2@
  39. if@H_301_2@(pBookNode==NULL)@H_301_2@@H_301_2@
  40. //读取book节点的id属性@H_301_2@@H_301_2@@H_301_2@
  41. MSXML2::IXMLDOMNodePtrpId=pBookNode->attributes->getNamedItem("id"@H_301_2@);@H_301_2@@H_301_2@
  42. cout<<"BookID:"@H_301_2@<<pId->text<<@H_301_2@"\t"@H_301_2@;@H_301_2@@H_301_2@
  43. //读取book节点下author子节点@H_301_2@@H_301_2@@H_301_2@
  44. MSXML2::IXMLDOMNodePtrpAuthorNode=pBookNode->selectSingleNode("author"@H_301_2@);@H_301_2@@H_301_2@
  45. if@H_301_2@(pAuthorNode==NULL)@H_301_2@@H_301_2@
  46. cout<<"Author:Error\t"@H_301_2@;@H_301_2@@H_301_2@
  47. else@H_301_2@@H_301_2@@H_301_2@
  48. cout<<"Author:"@H_301_2@<<pAuthorNode->text<<@H_301_2@"\t"@H_301_2@;@H_301_2@@H_301_2@
  49. cout<<endl;@H_301_2@
  50. CoUninitialize();@H_301_2@
  51. }@H_301_2@

输出结果:@H_301_2@


@H_301_2@

5. COM智能指针@H_301_2@

在示例代码中,我们看到使用了IXMLDOMElementPtr , IXMLDOMNodePtr 等智能指针,在MSDN中,并不能查到关于IXMLDOMElementPtr的信息,@H_301_2@

而只有IXMLDOMElement,实际上后缀带有Ptr的是对应的COM接口的智能指针。@H_301_2@在msxml3.tlh中,可以找到如下定义:@H_301_2@

_COM_SMARTPTR_TYPEDEF(IXMLDOMElement,__uuidof(IXMLDOMElement));
@H_301_2@

_COM_SMARTPTR_TYPEDEF宏用于定义一个_com_ptr_t 对象,_com_ptr_t封装了COM接口,称之为智能指针,该模板类用于负责资源的分配和释放,@H_301_2@

内部调用QueryInterface,AddRef,Release等IUnknown的函数。避免了编程人员对这些繁琐的操作一一处理。@H_301_2@

对上述宏展开后,就定义了智能指针 IXMLDOMElementPtr,其封装了IXMLDOMElement接口。@H_301_2@


@H_301_2@

转自: http://www.jb51.cc/article/p-yicvkkpt-bdn.html@H_301_2@

猜你在找的XML相关文章