//////////////////////////////////////////////////////////////////////////// // Helper function: Walk all the Elements at a particular node //////////////////////////////////////////////////////////////////////////// HRESULT CXMLDocument::WalkTree(int iLevel, MSXML::IXMLDOMNode* pNode) { HRESULT hr = S_OK; CComBSTR bstrNodeName; pNode->get_nodeName(&bstrNodeName); CComVariant vNodeValue; pNode->get_nodeValue(&vNodeValue); vNodeValue.ChangeType(VT_BSTR); CString strValueString = V_BSTR(&vNodeValue); if (m_pCallbackFunction) m_pCallbackFunction(iLevel, CString(bstrNodeName), strValueString, m_pCallbackParam); MSXML::IXMLDOMNamedNodeMapPtr pAttributes = NULL; if (SUCCEEDED(pNode->get_attributes(&pAttributes)) && (pAttributes != NULL)) { MSXML::IXMLDOMNodePtr pAttribute = NULL; pAttributes->nextNode(&pAttribute); while (pAttribute) { CComBSTR bstrNodeName; pAttribute->get_nodeName(&bstrNodeName); CComVariant vNodeValue; pAttribute->get_nodeValue(&vNodeValue); vNodeValue.ChangeType(VT_BSTR); CString strValueString = V_BSTR(&vNodeValue); if (m_pCallbackFunction) m_pCallbackFunction(iLevel+1, CString(bstrNodeName), strValueString, m_pCallbackParam); pAttributes->nextNode(&pAttribute); } } MSXML::IXMLDOMNodePtr pChild = NULL; pNode->get_firstChild(&pChild); while (pChild) { WalkTree(iLevel+1, pChild); MSXML::IXMLDOMNode* pNext = NULL; pChild->get_nextSibling(&pNext); pChild = pNext; } return S_OK; }