Introduction
The Simple API for XML (SAX) provides an alternate and more efficient way to parse XML files. MSDN has a ton of information on both the DOM and SAX APIs.
Last night I was reading through the documentation on how to use SAX and the MXXMLWriter
to generate XML files. However, the only sample is written in VB and there was a request in the comments section for a working C++ sample. Since I figure that I have to eventually write code to do that, why not quickly port the sample over to VC++ as an exercise for myself and a service to others?
Project information
So here is the sample, written in C++ in conjunction with some light ATL (mainly to wrap Win32 API calls and for smart pointers). Here is what you need to build the sample:
- Compiler: VC++ 6 (any service pack level should be fine)
- Dependencies: MSXML 3.0 and up (you should install it prior to compile), ATL 3.0
- Build: tested with debug and release builds with non-Unicode and Unicode configurations (so I guess it should run ok on Win9x?)
Some details
I spent some time to make the dialog resizable, unlike the VB sample where you really can't see the generated XML output if you are using a large file. Otherwise everything should behave very much like the VB sample. If you want to see the resizing code in action (which is another good exercise in itself), the following functions contain all the logic:
CMainDlg::Init()
- set up
CMainDlg::OnSize()
- actual resizing
The Try File
and Try Demo
functions are similar to the VB sample, except some minor modifications to set up the interface pointers and to get the data types correct. I would suggest that you download the VB sample as a reference.
In the VB sample, the left edit box is called "TextSource" and the right edit box is called "TextResult". In the VC++ port, I called them "Events" and "XML" respectively.
In the CMainDlg::OnTryDemo()
function, I needed to use an ISAXAttributes
and an IMXAttributes
pointer to reference the SAXAttributes
object that I created. That is because the addAttribute
and clear
methods are part of the IMXAttributes
interface.
I have also included the test XML files that come with the original VB sample in the compressed file. The test1.xml file apparently contains a missing ">", so an error will be generated when you try that file. I am not sure whether this was intentional to test the error case or it was just a typo, but at least I have included some error checking in there, just to show that it works. :)
Conclusion
Credits go to Microsoft for providing a simple enough VB sample that I can read and understand.
This is my first article so I would very much appreciate any feedbacks.