读取XML并在TreeCtrl中显示

//Xml.h文件

#pragma once

#import <msxml.dll> named_guids

using namespace MSXML;

/*

1.stdafx.h中添加一下语句

#import <msxml.dll> named_guids

using namespace MSXML;

2.Treehas Buttons,Has Lines,Lines at Root,Scroll必须设置为TRUE

*/

#include"smMacro.h"

class DECLSPEC CXml

{ 

   CTreeCtrl *m_tree;

   void DisplayChildren(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pParent);

   HTREEITEM DisplayChild(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pChile);

public:

   CXml();

   ~CXml(void);

   int DisplayXML(CString& strFileName,CTreeCtrl&lstXML);

  

};

//Xml.cpp文件

 

 

CXml::CXml(void)

{

   AFX_MANAGE_STATE(AfxGetStaticModuleState());

  

   CoInitialize(NULL);  

}

 

CXml::~CXml(void)

{

   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   ::CoUninitialize();

}

 

int CXml::DisplayXML(CString& strFileName,CTreeCtrl& lstXML)

{

   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   MSXML::IXMLDOMDocumentPtr m_plDomDocument;

   MSXML::IXMLDOMElementPtr  m_pDocRoot;

   HRESULT hr = m_plDomDocument.CreateInstance(MSXML::CLSID_DOMDocument);

   if (FAILED(hr))

   {

      _com_error er(hr);

      AfxMessageBox(er.ErrorMessage());   

   }

 

   m_tree=&lstXML;

   _bstr_t bstrFileName=strFileName.AllocSysString () ;

   variant_t vResult;

   vResult=m_plDomDocument->load(bstrFileName);

   if ((bool)vResult==TRUE)

   {

      m_pDocRoot = m_plDomDocument->documentElement;

      DisplayChildren(TVI_ROOT, m_pDocRoot);

      if (0==m_tree->GetCount())

      {

         m_tree->InsertItem("Empty Document");

      }    

   }

   else

   {

      m_tree->InsertItem("Document FAILED to load");

      TRACE("Document FAILED to load");

   }

   return 0;

}

void CXml::DisplayChildren(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pParent)

{

   HTREEITEM hItem=DisplayChild(hParent,pParent);

   for (MSXML::IXMLDOMNodePtr pChild=pParent->firstChild;NULL!=pChild;

      pChild=pChild->nextSibling)

   {

      DisplayChildren(hItem,pChild);

   }

}

 

HTREEITEM CXml::DisplayChild(HTREEITEM hParent, MSXML::IXMLDOMNodePtr pChild)

{

   CString strElement;

   if (MSXML::NODE_TEXT==pChild->nodeType)

   {

      strElement=(LPCTSTR)pChild->text;

     

   }

   else

      strElement=(LPCTSTR)pChild->nodeName;

   return m_tree->InsertItem(strElement,hParent);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值