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