AndrewWang1
July 21st, 2000, 12:59 AM
I can use MSXML in my MFC project but I don't know how to import it in my ATL project .
Can someone tell me how to use MSXML parser in the ATL Dll project ?
THANKS A LOTS
BEST
Andrew :)
Hi Pals
This is Andrew Wang, Nice to meet you
florini
July 24th, 2000, 02:35 PM
Try this:
/////////////////// SAVE THIS AS MSXML Wrapper.h
/*
*$Header: /Portal Client/PC_CorePC/MSXML Wrapper.h 3 21-06-00 20:05 Florini $
*
*$Workfile: MSXML Wrapper.h $
*$Revision: 3 $
*$Modtime: 15-06-00 22:12 $
*$Author: Florini $
*$Date: 21-06-00 20:05 $
*$History: MSXML Wrapper.h $
*
* ***************** Version 3 *****************
* User: Florini Date: 21-06-00 Time: 20:05
* Updated in $/Portal Client/PC_CorePC
* Preparing for async download implementation
*
* ***************** Version 2 *****************
* User: Florini Date: 13-06-00 Time: 11:12
* Updated in $/Portal Client/PC_CorePC
* Release for Dell demo
*
* ***************** Version 1 *****************
* User: Florini Date: 21-04-00 Time: 20:59
* Created in $/Portal Client/PC_CorePC
* First prototype sent
*/
#ifndef MSXML_Wrapper_Hdr
#define MSXML_Wrapper_Hdr
#pragma once
// Included headers (must come before definition of EXP_FROM_HOST_DLL)
#import <msxml.dll>
#ifdef MSXML_Wrapper_Src
# define EXP_FROM_HOST_DLL __declspec( dllexport )
#else // MSXML_Wrapper_Src
# define EXP_FROM_HOST_DLL EXP_PC_CorePC
#endif // MSXML_Wrapper_Src
#define EXPDATA_FROM_HOST_DLL EXPDATA_PC_CorePC
_variant_t safeGetAttribute( MSXML::IXMLDOMNodePtr node, _bstr_t attributeName );
_variant_t safeGetChild( MSXML::IXMLDOMNodePtr node, _bstr_t childName );
//################# safeGetAttribute #################
template< class AttrType >
inline AttrType safeGetAttribute( MSXML::IXMLDOMNodePtr node, _bstr_t attributeName,
AttrType defaultValue )
{
_variant_t safeAttribute = safeGetAttribute( node, attributeName );
if( safeAttribute.vt == VT_EMPTY )
return defaultValue;
return (AttrType)safeAttribute;
}
//################# safeGetAttribute< bool > #################
template<>
bool safeGetAttribute< bool >( MSXML::IXMLDOMNodePtr node, _bstr_t attributeName,
bool defaultValue );
//################# safeGetChild #################
template< class AttrType >
inline AttrType safeGetChild( MSXML::IXMLDOMNodePtr node, _bstr_t childName,
AttrType defaultValue )
{
_variant_t safeChild = safeGetChild( node, childName );
if( safeChild.vt == VT_NULL || safeChild.vt == VT_EMPTY )
return defaultValue;
return (AttrType)safeChild;
}
//################# safeGetAttributeOrChild #################
template< class AttrType >
inline AttrType safeGetAttributeOrChild( MSXML::IXMLDOMNodePtr node, _bstr_t attributeName,
AttrType defaultValue )
{
_variant_t safeAttribute = safeGetAttribute( node, attributeName );
if( safeAttribute.vt == VT_EMPTY )
return safeGetChild( node, attributeName, defaultValue );
return (AttrType)safeAttribute;
}
#undef EXP_FROM_HOST_DLL
#undef EXPDATA_FROM_HOST_DLL
// Inline code:
// #include "MSXML Wrapper.hxx"
#endif // MSXML_Wrapper_Hdr
/////////////////// SAVE THIS AS MSXML Wrapper.cpp
/*
*$Header: /Portal Client/PC_CorePC/MSXML Wrapper.cpp 3 21-06-00 20:05 Florini $
*
*$Workfile: MSXML Wrapper.cpp $
*$Revision: 3 $
*$Modtime: 16-06-00 18:21 $
*$Author: Florini $
*$Date: 21-06-00 20:05 $
*$History: MSXML Wrapper.cpp $
*
* ***************** Version 3 *****************
* User: Florini Date: 21-06-00 Time: 20:05
* Updated in $/Portal Client/PC_CorePC
* Preparing for async download implementation
*
* ***************** Version 2 *****************
* User: Florini Date: 13-06-00 Time: 11:12
* Updated in $/Portal Client/PC_CorePC
* Release for Dell demo
*
* ***************** Version 1 *****************
* User: Florini Date: 21-04-00 Time: 20:59
* Created in $/Portal Client/PC_CorePC
* First prototype sent
*/
#include "StdAfx.h"
#define MSXML_Wrapper_Src
#include "MSXML Wrapper.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif // _DEBUG
//################# safeGetAttribute #################
_variant_t safeGetAttribute( MSXML::IXMLDOMNodePtr node, _bstr_t attributeName )
{
_ASSERTE( node != NULL );
MSXML::IXMLDOMNodePtr attrNode;
try
{ attrNode = node->attributes->getNamedItem( attributeName );
}
catch( _com_error )
{
}
if( attrNode == NULL )
{ static _variant_t vtEmpty;
return vtEmpty;
}
return attrNode->text;
}
//################# safeGetChild #################
_variant_t safeGetChild( MSXML::IXMLDOMNodePtr node, _bstr_t childName )
{
_ASSERTE( node != NULL );
static _variant_t vtEmpty;
MSXML::IXMLDOMNodePtr childNode;
HRESULT outcome = node->raw_selectSingleNode( childName, &childNode );
if( outcome != S_OK )
return vtEmpty;
return childNode->text;
}
//################# safeGetAttribute< bool > #################
template<>
bool safeGetAttribute< bool >( MSXML::IXMLDOMNodePtr node, _bstr_t attributeName,
bool defaultValue )
{
_ASSERTE( node != NULL );
_variant_t safeAttribute = safeGetAttribute( node, attributeName );
switch( safeAttribute.vt )
{ case VT_EMPTY:
return defaultValue;
case VT_I2:
return V_I2( &safeAttribute ) != 0;
case VT_I4:
return V_I4( &safeAttribute ) != 0;
case VT_BOOL:
return V_BOOL( &safeAttribute ) != 0;
case VT_I1:
return V_I1( &safeAttribute ) != 0;
case VT_UI1:
return V_UI1( &safeAttribute ) != 0;
case VT_UI2:
return V_UI2( &safeAttribute ) != 0;
case VT_UI4:
return V_UI4( &safeAttribute ) != 0;
// case VT_I8:
// return V_I8( &safeAttribute ) != 0;
// case VT_UI8:
// return V_UI8( &safeAttribute ) != 0;
case VT_INT:
return V_INT( &safeAttribute ) != 0;
case VT_UINT:
return V_UINT( &safeAttribute ) != 0;
case VT_BSTR:
{ _bstr_t boolAsString = V_BSTR( &safeAttribute );
return _tcsicmp( boolAsString, _T( "1" ) ) == 0 ||
_tcsicmp( boolAsString, _T( "true" ) ) == 0 ||
_tcsicmp( boolAsString, _T( "yes" ) ) == 0 ||
_tcsicmp( boolAsString, _T( "y" ) ) == 0;
}
default:
return false;
}
}
Then, in your code, do things like:
// ...
//################# CHECKED_CALL #################
#define CHECKED_CALL( f )\
do\
{ HRESULT __local_outcome__ = ( f );\
\
if( !SUCCEEDED( __local_outcome__ ) )\
return __local_outcome__;\
} while( false )\
// ...
//################# trace #################
void trace( const TCHAR* fmt, ... )
{
va_list va;
va_start( va, fmt );
TCHAR buffer[ 4000 ];
vsprintf( buffer, fmt, va );
OutputDebugString( buffer );
}
// ...
MSXML::IXMLDOMDocumentPtr xmlDoc;
BSTR xmlText;
VARIANT_BOOL isSuccessful = VARIANT_FALSE;
// ...
CHECKED_CALL( xmlDoc.CreateInstance( __uuidof( MSXML::DOMDocument ) ) );
CHECKED_CALL( xmlDoc->raw_loadXML( xmlText, &isSuccessful ) );
if( !isSuccessful )
{ trace( _T( "*** XML Parse failed\n" ) );
if( xmlDoc->parseError != NULL )
{ trace( _T( " errorCode: %d (0x%08X)\n" ), xmlDoc->parseError->errorCode,
xmlDoc->parseError->errorCode );
trace( _T( " url: %s\n" ), (const TCHAR*)xmlDoc->parseError->url );
trace( _T( " reason: %s\n" ), (const TCHAR*)xmlDoc->parseError->reason );
trace( _T( " srcText: %s\n" ), (const TCHAR*)xmlDoc->parseError->srcText );
trace( _T( " line: %d\n" ), xmlDoc->parseError->line );
trace( _T( " linepos: %d\n" ), xmlDoc->parseError->linepos );
trace( _T( " filepos: %d\n" ), xmlDoc->parseError->filepos );
}
}
MSXML::IXMLDOMNodePtr root = xmlDoc;
MSXML::IXMLDOMNodeListPtr whateverCollections = xmlDoc->getElementsByTagName( L"Whatevers" );
for( long i = 0; i < whateverCollections->length; ++i )
CHECKED_CALL( doSomething( whateverCollections->item[ i ] ) );
// ...
////////////////////////////////////////////
Hope this helps,
Florin