#include "stdafx.h" #include "XMLDOMNodes.h" #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CXMLDOMNodes::CXMLDOMNodes( void ) { m_pXMLDOMNodeList = NULL; } CXMLDOMNodes::CXMLDOMNodes( const CXMLDOMNodes& srcXMLDOMNodes ) { ASSERT( NULL != srcXMLDOMNodes.m_pXMLDOMNodeList ); m_pXMLDOMNodeList = srcXMLDOMNodes.m_pXMLDOMNodeList; } CXMLDOMNodes::CXMLDOMNodes( MSXML2::IXMLDOMNodeListPtr pXMLDOMNodeList ) { m_pXMLDOMNodeList = pXMLDOMNodeList; } CXMLDOMNodes::~CXMLDOMNodes() { if( NULL != m_pXMLDOMNodeList ) { m_pXMLDOMNodeList.Release(); } m_pXMLDOMNodeList = NULL; } CXMLDOMNodes& CXMLDOMNodes::operator= ( const CXMLDOMNodes& srcXMLDOMNodes ) { if( *this == srcXMLDOMNodes ) { return *this; } if( NULL != m_pXMLDOMNodeList ) { m_pXMLDOMNodeList.Release(); m_pXMLDOMNodeList = NULL; } m_pXMLDOMNodeList = srcXMLDOMNodes.m_pXMLDOMNodeList; return *this; } CXMLDOMNodesPtr CXMLDOMNodes::operator= ( CXMLDOMNodesPtr psrcXMLDOMNodes ) { if( NULL != m_pXMLDOMNodeList ) { m_pXMLDOMNodeList.Release(); m_pXMLDOMNodeList = NULL; } m_pXMLDOMNodeList = psrcXMLDOMNodes->m_pXMLDOMNodeList; return psrcXMLDOMNodes; } bool CXMLDOMNodes::operator== ( const CXMLDOMNodes& srcXMLDOMNodes ) { return ( m_pXMLDOMNodeList == srcXMLDOMNodes.m_pXMLDOMNodeList ); } bool CXMLDOMNodes::operator!= ( const CXMLDOMNodes& srcXMLDOMNodes ) { return ( m_pXMLDOMNodeList != srcXMLDOMNodes.m_pXMLDOMNodeList ); } CXMLDOMNodePtr CXMLDOMNodes::operator[] ( int nIndex ) { return GetItem( nIndex ); } // Overload operator "[]" for Geting Nodes item by Node Name: CXMLDOMNodePtr CXMLDOMNodes::operator[] ( const TCHAR* pszNodeName ) { return GetItem( pszNodeName ); } bool operator==( const CXMLDOMNodesPtr& pXMLDOMNodes1, const CXMLDOMNodesPtr& pXMLDOMNodes2 ) { //return ( *pXMLDOMNodes1.get() == *pXMLDOMNodes2.get() ); int nCount1 = pXMLDOMNodes1->GetCount(); int nCount2 = pXMLDOMNodes2->GetCount(); if ( nCount1 != nCount2 ) { return false; } bool bEqual = true; MSXML2::IXMLDOMNodePtr p1 = NULL; MSXML2::IXMLDOMNodePtr p2 = NULL; for( int i=0; iGetCount(); i++ ) { p1 = pXMLDOMNodes1.get()->GetNodeListPtr()->item[i]; p2 = pXMLDOMNodes2.get()->GetNodeListPtr()->item[i]; if( p1 != p2 ) { bEqual = false; break; } } if( p1 != NULL ) { p1.Release(); p1 = NULL; } if( p2 != NULL ) { p2.Release(); p2 = NULL; } return bEqual; } bool operator!=( const CXMLDOMNodesPtr& pXMLDOMNodes1, const CXMLDOMNodesPtr& pXMLDOMNodes2 ) { //return ( *pXMLDOMNodes1.get() != *pXMLDOMNodes2.get() ); int nCount1 = pXMLDOMNodes1->GetCount(); int nCount2 = pXMLDOMNodes2->GetCount(); if ( nCount1 != nCount2 ) { return true; } bool bNotEqual = false; MSXML2::IXMLDOMNodePtr p1 = NULL; MSXML2::IXMLDOMNodePtr p2 = NULL; for( int i=0; iGetCount(); i++ ) { p1 = pXMLDOMNodes1.get()->GetNodeListPtr()->item[i]; p2 = pXMLDOMNodes2.get()->GetNodeListPtr()->item[i]; if( p1 != p2 ) { bNotEqual = true; break; } } if( p1 != NULL ) { p1.Release(); p1 = NULL; } if( p2 != NULL ) { p2.Release(); p2 = NULL; } return bNotEqual; } bool operator!=( const TCHAR* pNULL, const CXMLDOMNodesPtr& pXMLDOMNodes2 ) { ASSERT( NULL == pNULL ); return( NULL != pXMLDOMNodes2.get()->GetNodeListPtr() ); } bool operator!=( const CXMLDOMNodesPtr& pXMLDOMNodes1, const TCHAR* pNULL ) { ASSERT( NULL == pNULL ); return( NULL != pXMLDOMNodes1.get()->GetNodeListPtr() ); } bool operator==( const TCHAR* pNULL, const CXMLDOMNodesPtr& pXMLDOMNodes2 ) { ASSERT( NULL == pNULL ); return( NULL == pXMLDOMNodes2.get()->GetNodeListPtr() ); } bool operator==( const CXMLDOMNodesPtr& pXMLDOMNodes1, const TCHAR* pNULL ) { ASSERT( NULL == pNULL ); return( NULL == pXMLDOMNodes1.get()->GetNodeListPtr() ); } int CXMLDOMNodes::GetCount() { ASSERT( NULL != m_pXMLDOMNodeList ); if( NULL == m_pXMLDOMNodeList ) { return 0; } int nCount = 0; MSXML2::DOMNodeType NodeType; MSXML2::IXMLDOMNodePtr pXMLDOMNode = NULL; try { for( int i = 0; i < m_pXMLDOMNodeList->length; i++ ) { pXMLDOMNode = m_pXMLDOMNodeList->item[i]; HRESULT hr = pXMLDOMNode->get_nodeType( &NodeType ); ASSERT( SUCCEEDED( hr ) ); if( FAILED( hr ) ) { if( NULL != pXMLDOMNode ) { pXMLDOMNode.Release(); pXMLDOMNode = NULL; } return 0; } // Only count element node. if( NodeType == MSXML2::NODE_ELEMENT ) { nCount ++; } if( NULL != pXMLDOMNode ) { pXMLDOMNode.Release(); pXMLDOMNode = NULL; } } } catch ( ... ) { #ifdef _DEBUG MessageBox( NULL, TEXT("UnKnown error occured!"), TEXT("Error"), MB_OK|MB_ICONSTOP ); #endif if( NULL != pXMLDOMNode ) { pXMLDOMNode.Release(); pXMLDOMNode = NULL; } ASSERT( false ); return 0; } return nCount; } CXMLDOMNodePtr CXMLDOMNodes::GetItem( int nIndex ) { ASSERT( NULL != m_pXMLDOMNodeList ); if( NULL == m_pXMLDOMNodeList ) { RETURN_NULL; } int nGetCount = GetCount(); ASSERT( nIndex >= 0 && nIndex < nGetCount ); if( nIndex < 0 || nIndex >= nGetCount ) { RETURN_NULL; } int nCount = 0; MSXML2::DOMNodeType NodeType; MSXML2::IXMLDOMNodePtr pXMLDOMNodesItem = NULL; CXMLDOMNodePtr pXMLDOMNode ( new CXMLDOMNode() ); try { for( int i = 0; i < m_pXMLDOMNodeList->length; i++) { pXMLDOMNodesItem = m_pXMLDOMNodeList->item[i]; HRESULT hr = pXMLDOMNodesItem->get_nodeType( &NodeType ); ASSERT( SUCCEEDED(hr) ); if( NodeType == MSXML2::NODE_ELEMENT ) { if( nCount == nIndex ) { pXMLDOMNode->m_pXMLDOMNode = pXMLDOMNodesItem; if( NULL != pXMLDOMNodesItem ) { pXMLDOMNodesItem.Release(); pXMLDOMNodesItem = NULL; } return pXMLDOMNode; } nCount ++; } if( NULL != pXMLDOMNodesItem ) { pXMLDOMNodesItem.Release(); pXMLDOMNodesItem = NULL; } } } catch ( ... ) { #ifdef _DEBUG MessageBox( NULL, TEXT("UnKnown error occured!"), TEXT("Error"), MB_OK|MB_ICONSTOP ); #endif if( NULL != pXMLDOMNodesItem ) { pXMLDOMNodesItem.Release(); pXMLDOMNodesItem = NULL; } ASSERT( false ); RETURN_NULL; } return pXMLDOMNode; } CXMLDOMNodePtr CXMLDOMNodes::GetItem( const TCHAR* pszNodeName ) { ASSERT( NULL != m_pXMLDOMNodeList ); if( NULL == m_pXMLDOMNodeList ) { RETURN_NULL; } ASSERT( NULL != pszNodeName ); if( NULL == pszNodeName ) { RETURN_NULL; } TCHAR szName[MAX_PATH]; memset( szName, 0, sizeof( szName ) ); BSTR bstr = NULL; MSXML2::IXMLDOMNodePtr pXMLDOMNodesItem = NULL; CXMLDOMNodePtr pXMLDOMNode( new CXMLDOMNode() ); try { for( int i = 0; i < m_pXMLDOMNodeList->length; i++ ) { pXMLDOMNodesItem = m_pXMLDOMNodeList->item[i]; HRESULT hr = pXMLDOMNodesItem->get_nodeName( &bstr ); ASSERT( SUCCEEDED(hr) ); _tcscpy( szName ,( TCHAR* )_bstr_t( bstr) ); if( NULL != bstr ) { SysFreeString( bstr ); bstr = NULL; } if( _tcscmp( szName, pszNodeName) == 0 ) { pXMLDOMNode->m_pXMLDOMNode = pXMLDOMNodesItem; if( NULL != pXMLDOMNodesItem ) { pXMLDOMNodesItem.Release(); pXMLDOMNodesItem = NULL; } return pXMLDOMNode; } if( NULL != pXMLDOMNodesItem ) { pXMLDOMNodesItem.Release(); pXMLDOMNodesItem = NULL; } } } catch ( ... ) { #ifdef _DEBUG MessageBox( NULL, TEXT("UnKnown error occured!"), TEXT("Error"), MB_OK|MB_ICONSTOP ); #endif if( NULL != pXMLDOMNodesItem ) { pXMLDOMNodesItem.Release(); pXMLDOMNodesItem = NULL; } ASSERT( false ); RETURN_NULL; } return pXMLDOMNode; }