怎么样用C++调用MSXML组件读取XML文件

运行环境为vs2005,msxml3.0

下面是我们要读取的一个XML文档text.xml.

  1. <?xml version="1.0" encoding="gb2312"?>
  2. <xmlRoot>
  3.     <Item Start="天津" Aim="南京" Date="2008/12/15"/>
  4.     <Item Start="南京" Aim="北京" Date="2008/12/15"/>
  5.     <Item Start="天津" Aim="海南" Date="2008/12/16"/>
  6. </xmlRoot>

下面是程序的主要代码:

  1.     MSXML2::IXMLDOMDocumentPtr xmldoc = NULL;
  2.     MSXML2::IXMLDOMNodeList* pNodeList = NULL;
  3.     VARIANT_BOOL isread = VARIANT_FALSE;
  4.     
  5.     
  6.     long nodes = 0;
  7.     
  8.     CoInitialize(NULL);
  9.     if(!SUCCEEDED(xmldoc.CreateInstance(__uuidof(MSXML2::DOMDocument30))))
  10.     {
  11.         printf("组件初始化失败!");
  12.         return -1;
  13.     }
  14.     VARIANT var_src;
  15.     BSTR src = SysAllocString(L"text.xml");
  16.     V_BSTR(&var_src) = SysAllocString(src);
  17.     V_VT(&var_src) = VT_BSTR;   
  18.      
  19.     xmldoc->load(var_src,&isread);
  20.     if(isread != VARIANT_TRUE)
  21.     {
  22.         printf("XML文件读取错误!");
  23.         return -1;
  24.     }
  25.     xmldoc->selectNodes(L"//xmlRoot//Item",&pNodeList);
  26.     if(pNodeList == NULL)
  27.     {
  28.         printf("结点选取错误!");
  29.         return -1;
  30.     }
  31.     pNodeList->get_length(&nodes);
  32.     for(int i = 0;i<nodes;i++)
  33.     {
  34.         MSXML2::IXMLDOMNode *pNode = NULL;
  35.         MSXML2::IXMLDOMNamedNodeMap *pAttribs = NULL;
  36.         long attribs = 0;
  37.         pNodeList->get_item(i,&pNode);
  38.         pNode->get_attributes(&pAttribs);
  39.         pAttribs->get_length(&attribs);
  40.         for(int j=0;j<attribs;j++)
  41.         {
  42.             MSXML2::IXMLDOMNode *pAttrib = NULL;
  43.             BSTR str;
  44.             VARIANT var;
  45.             pAttribs->get_item(j,&pAttrib);
  46.             pAttrib->get_nodeName(&str);
  47.             pAttrib->get_nodeValue(&var);
  48.             setlocale(LC_CTYPE, ""); 
  49.             printf("%S:%S/t",str,var.bstrVal);
  50.             SysFreeString(str);
  51.             VariantClear(&var);
  52.             pAttrib->Release();
  53.         }
  54.         printf("/n");
  55.         pNode->Release();
  56.         pAttribs->Release();        
  57.     }   
  58.     pNodeList->Release();
  59.     VariantClear(&var_src);
  60.     
  61.     xmldoc.Release();
  62.     CoUninitialize();

代码比较简单,所要提醒的是因为xmldoc是一个智能指针,所以当它被释放,重新赋值的时候都会将原来的所指向的内容释放,也就是是会调用内部指针的Release()所以。在xmldoc.Release()之前不要调用xmldoc->Release()或是CoUninitialize()之类会释放内部指针所指对象的方法.否者会发生异常。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值