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