VC使用MSXML.dll读取XML文件

XML最近被吹的神乎其神,很多数据的交换,包括很多中间件系统,WebService,软件的配置文件,都是在用XML这个技术,的确是个好东西,下面写了个读取XML的代码片段,用的是MSXML的一些接口。

读的是BT软件的配置文件,XML内容如下:

<?xml version="1.0"?>

<BitComet Author="RnySmile" Version="0.1">

       <Settings>

              <LastSaveLocation>E:\电子书</LastSaveLocation>

              <ListenPort>8497</ListenPort>

              <GlobalMaxUploadRate>3072</GlobalMaxUploadRate>

              <LastAdCacheClearDate>13104</LastAdCacheClearDate>

              <LastTrackerKey>16547</LastTrackerKey>

              <TotalUpload>303008</TotalUpload>

              <TotalDownload>1180107</TotalDownload>

              <LastExitTime>1132203124</LastExitTime>

       </Settings>

</BitComet>

代码如下:

#include "stdafx.h"  

#include <iostream>  

using namespace std; 

#include <msxml.h>  

#include <atlstr.h>  

#import "msxml.dll" raw_interfaces_only  

int _tmain(int argc, _TCHAR* argv[])  

{  

     ::CoInitialize(NULL);  

     CComPtr<MSXML::IXMLDOMDocument> spDoc;  

     HRESULT hr = spDoc.CoCreateInstance(__uuidof(MSXML::DOMDocument));    //创建文档对象 

     VARIANT_BOOL bFlag; 

     hr = spDoc->load(CComVariant(L"BitComet.xml"), &bFlag);               //load xml文件  

     CComPtr<MSXML::IXMLDOMElement> spElement;

     hr = spDoc->get_documentElement(&spElement);   //获取根结点  

     CComBSTR strTagName;  

     hr = spElement->get_tagName(&strTagName);  

     cout << "------TagName------" << endl;  

     cout << CString(strTagName) << endl;  

     CComPtr<MSXML::IXMLDOMNodeList> spNodeList;  

     hr = spElement->get_childNodes(&spNodeList);   //获取子结点列表  

     long lCount;                                

     hr = spNodeList->get_length(&lCount);  

     for (long i=0; i<lCount; ++i)  

     {  

         CComVariant varNodeValue;  

         CComPtr<MSXML::IXMLDOMNode> spNode; 

         MSXML::DOMNodeType NodeType;  

         CComPtr<MSXML::IXMLDOMNodeList> spChildNodeList;  

         hr = spNodeList->get_item(i, &spNode);         //获取结点  

         hr = spNode->get_nodeType(&NodeType);     //获取结点信息的类型  

         if (NODE_ELEMENT == NodeType)  

         {  

              hr = spNode->get_childNodes(&spChildNodeList);  

              long childLen;  

              hr = spChildNodeList->get_length(&childLen);  

              cout << "------NodeList------" << endl;  

              for (int j=0; j<childLen; ++j)  

              {  

                   CComPtr<MSXML::IXMLDOMNode> spChildNode;  

                   CComBSTR value;  

                   hr = spChildNodeList->get_item(j, &spChildNode); 

                   hr = spChildNode->get_nodeName(&value);            //获取结点名字 

                   cout << CString(value) << endl;  

                   hr = spChildNode->get_text(&value);                //获取结点的值 

                   cout << CString(value) << endl << endl;          

                   spChildNode.Release();  

              }  

         }  

         spNode.Release();  

         spChildNodeList.Release();  

     }  

     spNodeList.Release();  

     spElement.Release();  

     spDoc.Release();  

     ::CoUninitialize();  

     return 0;  

}  

输出结果如下:

------TagName------  

BitComet  

------NodeList------  

LastSaveLocation  

E:\电子书  

ListenPort  

8497  

GlobalMaxUploadRate  

3072  

LastAdCacheClearDate  

13104  

LastTrackerKey  

16547  

TotalUpload  

303008  

TotalDownload  

1180107  

LastExitTime  

1132203124 

这是一个最简单的demo,下次软件的配置信息,可以考虑用XML


转自:http://xuchang163email.blog.163.com/blog/static/75963966200810723431234/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值