MFC 解析XML

现在经常会对XML文件进行操作,怎么在MFC下去读和解析XML文件呢?直接上代码:

       首先得等在stdafx.h中加入这句,以引入MSXML命名空间

#import <msxml3.dll> named_guids
using namespace MSXML2;

       然后再要使用的类的头文件加入:   

[cpp]  view plain copy
  1. //XML Parser intellectural pointer (used in parsing XML file)  
[cpp]  view plain copy
  1. MSXML2::IXMLDOMDocument2Ptr   m_plDomDocument;  
  2. MSXML2::IXMLDOMElementPtr   m_pDocRoot;  

       然后在初始化函数中加入对XML COM的初始化:

[cpp]  view plain copy
  1.   //intianlize XML Parser COM   
  2.   ::CoInitialize(NULL);  
  3.   HRESULT hr = m_plDomDocument.CreateInstance(MSXML2::CLSID_DOMDocument);  
  4.   
  5.   if(FAILED(hr))  
  6.   {  
  7. _com_error er(hr);  
  8. AfxMessageBox(er.ErrorMessage());  
  9. EndDialog(1);  
  10.   }  


       接着是具体的函数:

[cpp]  view plain copy
  1. void CDemoDlg::OnBnClickedButtonOpenxml()  
  2. {  
  3.     // at first ,we should clear m_strXML's contents to show new data  
  4.     m_strXMLData = "";  
  5.   
  6.     CFileDialog fileDlg(TRUE);  
  7.     if(IDOK == fileDlg.DoModal())  
  8.     {  
  9.         m_strXMLPath = fileDlg.GetPathName();  
  10.         m_strXMLContents = "Empty document";  
  11.   
  12.         //just in case you don't get anything  
  13.         UpdateData(FALSE);  
  14.   
  15.         //Specify XML file name  
  16.         CString strFileName = m_strXMLPath;  
  17.   
  18.         //Convert XML file name string to something COM can handle  
  19.         _bstr_t bstrFileName;  
  20.         bstrFileName = strFileName.AllocSysString();  
  21.   
  22.         //Call the IXMLDOMDocumentPtr's load function to load XML file  
  23.         variant_t vResult;  
  24.         vResult = m_plDomDocument->load(bstrFileName);  
  25.   
  26.         if(((bool)vResult) == TRUE ) //success  
  27.         {  
  28.             //Convert bstr to something you can use in VC++  
  29.             _bstr_t bstrDocContents = m_plDomDocument->xml;  
  30.             m_strXMLContents = (LPCTSTR) bstrDocContents;  
  31.   
  32.             //get XML data and show on Edit Control  
  33.             MSXML2::IXMLDOMNodePtr m_pXMLRoot = m_plDomDocument->documentElement;  //first child is point  
  34.             //m_strXMLData = _T(",") + DisplayXMLChildren(m_pXMLRoot);  
  35.               
  36.             //loop to show get point's Lon and Lan and save in map<CString,CString>LonLanPoints  
  37.             for(MSXML2::IXMLDOMNodePtr pChild = m_pXMLRoot->firstChild; pChild != NULL; pChild = pChild->nextSibling)  
  38.             {  
  39.                 DisplayXMLChildren(pChild);   
  40.             }  
  41.         }  
  42.         else  
  43.         {  
  44.             m_strXMLContents = "Document FAILED to load!";  
  45.         }  
  46.   
  47.         UpdateData(FALSE);  
  48.     }  
  49. }  
  50.   
  51.   
  52. //in case of overload data we use before, we should add one button for clear the data(Ready to transfrom)  
  53. CString CDemoDlg::DisplayXMLChildren(MSXML2::IXMLDOMNodePtr pParent)  
  54. {  
  55.     //Display current node's name  
  56.     //every parent's node name is POINT  
  57.     CString strElement = ((LPCTSTR)pParent->nodeName);  //output is point  
  58.   
  59.     //loop to get data  pChild's parent node is point,and point's parent node is road  
  60.     for(MSXML2::IXMLDOMNodePtr pChild = pParent->firstChild; pChild != NULL; pChild = pChild->nextSibling)  
  61.     {  
  62.         //strElement += ((LPCTSTR)pChild->nodeName);    
  63.         CString nodeName = ((LPCTSTR)pChild->nodeName);        
  64.         CString Lon = _T("Lon");  
  65.         CString Lan = _T("Lan");  
  66.         CString currentLon,currentLan;  
  67.   
  68.         if ( nodeName == Lon )  
  69.         {  
  70.             currentLon = ((LPCTSTR)pChild->text);  
  71.         }         
  72.         if ( nodeName == Lan )  
  73.         {  
  74.             currentLan = ((LPCTSTR)pChild->text);  
  75.         }  
  76.   
  77.         //add one point's Lon and Lan to map  
  78.         LonLanPoints.insert(currentLon,currentLan);  
  79.     }  
  80.     return strElement;  
  81. }  

[html]  view plain copy
  1. XML结构为:  
  2. <road>  
  3. <point>  
  4.     <id><id/>  
  5.     <Lon></Lon>  
  6.     <Lat></Lat>  
  7. </road>  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值