//Xml.h文件
#pragma once
#import <msxml.dll> named_guids
using namespace MSXML;
/*
1.在stdafx.h中添加一下语句
#import <msxml.dll> named_guids
using namespace MSXML;
2.Tree的has 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);
}