Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/XMLDOMNodes.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
}