
We use libxml2 with our own C++ wrappers (for SAX and XSLT mainly). The wrappers are incomplete (they only cover what we use) and they are not documented very well, so I don't think it would help much to publish them here. Instead I'll try to summarize what we would like, that libxml2 does not provide. We have some code that parses using the push parser within async callbacks (ISAPI). The only problem with this is that we can't perform async actions easily in the libxml2 SAX callbacks. Making an async call from a SAX callback is not possible without adding a queue, this is not very nice and would not work well with SAX functions that return objects (I think libxml2 has some of these and though I have not used them they look like just the kinds of things you would want to use asio for). For that reason I think the ideal low level interface would have the option of async callbacks. I think data should be pushed to it with an async write to give the caller control over the buffer size (and avoiding unnecessary copying). I don't think it is a good idea to focus on input alone. I think a good interface could be used for both input and output of XML. For instance, we have implemented a SAX handler that writes to a std::ostream and we use that as the lowest level of our xml output system. This is useful as it means we can easily use SAX for in-process communication and an XML stream for inter process (avoiding writing and parsing XML when possible). I think one good test case for a boost.xml would be a boost.asio application that reads XML from a socket and writes it to an XML parser. This would cause SAX like async events, and these events would write the XML back to the socket also using asio. A kind of XML echo. I hope this helps, Hamish