Creating the MyContent Class
After you create the MyContent.h file, the next step is to implement the ContentHandler
class, named MyContent
.
#include "stdafx.h" #include "MyContent.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// MyContent::MyContent() { idnt = 0; } MyContent::~MyContent() { } HRESULT STDMETHODCALLTYPE MyContent::startElement( /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri, /* [in] */ int cchNamespaceUri, /* [in] */ wchar_t __RPC_FAR *pwchLocalName, /* [in] */ int cchLocalName, /* [in] */ wchar_t __RPC_FAR *pwchQName, /* [in] */ int cchQName, /* [in] */ ISAXAttributes __RPC_FAR *pAttributes) { HRESULT hr = S_OK; int l; printf("\n%*s",3 * idnt++, ""); prt(L"<%s",pwchLocalName,cchLocalName); pAttributes->getLength(&l); for ( int i=0; i<l; i++ ) { wchar_t * ln, * vl; int lnl, vll; pAttributes->getLocalName(i,&ln,&lnl); prt(L" %s=", ln, lnl); pAttributes->getValue(i,&vl,&vll); prt(L"\"%s\"", vl, vll); } printf(">"); // A little example, how to abort parse if ( wcsncmp(pwchLocalName,L"qu",2) == 0 ) { printf("\n<qu> tag encountered, parsing aborted."); hr = E_FAIL; } return hr; } HRESULT STDMETHODCALLTYPE MyContent::endElement( /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri, /* [in] */ int cchNamespaceUri, /* [in] */ wchar_t __RPC_FAR *pwchLocalName, /* [in] */ int cchLocalName, /* [in] */ wchar_t __RPC_FAR *pwchQName, /* [in] */ int cchQName) { printf("\n%*s",3 * --idnt, ""); prt(L"</%s>",pwchLocalName,cchLocalName); return S_OK; } HRESULT STDMETHODCALLTYPE MyContent::startDocument() { printf("<?xml version=\"1.0\" ?>"); return S_OK; } void MyContent::prt( /* [in] */ const wchar_t * pwchFmt, /* [in] */ const wchar_t __RPC_FAR *pwchVal, /* [in] */ int cchVal) { static wchar_t val[1000]; cchVal = cchVal>999 ? 999 : cchVal; wcsncpy( val, pwchVal, cchVal ); val[cchVal] = 0; wprintf(pwchFmt,val); }