379 lines
7.5 KiB
C++
379 lines
7.5 KiB
C++
#include "stdafx.h"
|
|
|
|
#include "XMLDOMNodes.h"
|
|
#include <assert.h>
|
|
#include <tchar.h>
|
|
#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; i<pXMLDOMNodes1->GetCount(); 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; i<pXMLDOMNodes1->GetCount(); 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;
|
|
}
|