Listing 1: Implementation of ISAXContentHandler named as CustomerOrderHandler.

// ...
class CustomerOrderHandler : public ISAXContentHandler  
{
private:
    int         m_OrderID;
    wchar_t     m_CustomerName[20];
    wchar_t     m_ItemName[20];
    wchar_t     m_Unit[20];    
    double      m_Quantity;
    XmlString   m_CurrentTag;
public:
    CustomerOrderHandler(){}
    virtual ~CustomerOrderHandler(){}
    // other member functions not shown
    virtual HRESULT STDMETHODCALLTYPE startElement( 
        /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
        /* [in] */ int cchNamespaceUri,
        /* [in] */ wchar_t __RPC_FAR *pwchLocalName,
        /* [in] */ int cchLocalName,
        /* [in] */ wchar_t __RPC_FAR *pwchRawName,
        /* [in] */ int cchRawName,
        /* [in] */ ISAXAttributes __RPC_FAR *pAttributes)
    {
        // record where the document is being parsed
        m_CurrentTag = XmlString(pwchLocalName, cchLocalName);
        return S_OK;
    }
    virtual HRESULT STDMETHODCALLTYPE endElement( 
        /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
        /* [in] */ int cchNamespaceUri,
        /* [in] */ wchar_t __RPC_FAR *pwchLocalName,
        /* [in] */ int cchLocalName,
        /* [in] */ wchar_t __RPC_FAR *pwchRawName,
        /* [in] */ int cchRawName)
    {
        m_CurrentTag = XmlString(pwchLocalName, cchLocalName);
        if (m_CurrentTag == L"CustomerOrder")  // whole order has been parsed,
        {                                      // process this order now.
            std::wcout << L"Order " << m_OrderID 
            << L" from " << m_CustomerName 
            << L": " << m_ItemName 
            << L" " << m_Quantity 
            << L" " << m_Unit 
            << L"s has been processed." << std::endl;
        }
        m_CurrentTag = L"";  // clear the status for next element
        return S_OK;
    }
    virtual HRESULT STDMETHODCALLTYPE characters( 
        /* [in] */ wchar_t __RPC_FAR *pwchChars,
        /* [in] */ int cchChars)
    {
        if (m_CurrentTag == L"OrderID")
            m_OrderID = xmlstring_cast<int>(XmlString(pwchChars, cchChars));
        else if (m_CurrentTag == L"Customer")
        {
             wcsncpy(m_CustomerName, pwchChars, cchChars);
             m_CustomerName[cchChars] = L'\0';
        }
        else if (m_CurrentTag == L"Item")
        {
            wcsncpy(m_ItemName, pwchChars, cchChars);
            m_ItemName[cchChars] = L'\0';
        }
        else if (m_CurrentTag == L"Unit")
        {
            wcsncpy(m_Unit, pwchChars, cchChars);
            m_Unit[cchChars] = L'\0';
        }
        else if (m_CurrentTag == L"Quantity")
          m_Quantity = xmlstring_cast<double>(XmlString(pwchChars, cchChars));
         return S_OK;
    }
};
#endif