<div dir="ltr">Since we've been discussing XML parsers a lot...<div><br></div><div><a href="https://github.com/dwd/rapidxml">https://github.com/dwd/rapidxml</a> contains a fork of rapidxml that's been randomly hacked^W^Wcarefully optimized to make it more useful in XMPP projects that need particularly fine and/or controlled XML handling.</div>
<div><br></div><div>RapidXML is a C++ XML parser written from scratch by Marcin Kalicinski. It is written as template code based around C++03, though I'm actually using it within C++11 (hence the limited testing I've added is C++11).</div>
<div><br></div><div>RapidXML on its own is pretty fast - I think the second fastest XML parser out there - and can operate in a non-destructive in-place mode, where it skips entity decoding and hands you back unterminated string pointers into the source buffer. This is all you need for low-level stanza handling, of course. It seems to be impressively low in memory footprint, as it (generally) uses in-buffer rewriting.</div>
<div><br></div><div>This fork adds the ability to then run through the already semi-parsed XML and terminate strings, decode entities, etc. It will do this either recursively, or element-by-element, allowing you to do hideous things like parse out the stanza outer layer, terminate and decode, leaving the inner XML intact for later forwarding. It's possible this may leave XML purists in a state of horror, but it's handy in a server.</div>
<div><br></div><div>It also adds the excitement of partial XMLNS support - I've not yet done namespace well-formedness checking.</div><div><br></div><div>Also, various XMPP-specific kinds of parsing have been added. In particular, it can parse just an open tag (useful for <stream:stream>), and just one element (useful for stanzas and other TLEs), as well as keeping a document element "hanging about" (useful for, well, XML streams). This is absolutely certain to leave XML purists hiding behind the sofa.</div>
<div><br></div><div>It is offered without any kind of warranty, and as is traditional, it may not work at all. Caveat compiler, and all that. I've not yet bothered documenting any of the additions I've made, either; this makes it feel more like an adventure, I think.</div>
<div><br></div><div>It is licensed under the same terms as the original; that is, either the Boost license or the MIT one. I have probably forgotten to add my copyright to the relevant files; I do nevertheless have a copyright claim.</div>
<div><br></div><div>Patches are welcome. I might manage to figure out github pull requests one day, too.</div><div><br></div><div>If anyone wishes to produce language-specific wrappers, I'd be keen to see them too.</div>
<div><br></div><div>Dave.</div></div>