The hexpat package

This package provides a general purpose Haskell XML library using Expat to
do its parsing (http://expat.sourceforge.net/ - a fast stream-oriented XML
parser written in C). It is extensible to any string type, with String,
ByteString and Text provided out of the box.

If you want to do interactive I/O, an obvious option is to use lazy parsing
with one of the lazy I/O functions such as hGetContents. However, this can be
problematic in some applications because it doesn't handle I/O errors properly
and can give no guarantee of timely resource cleanup. In these cases, chunked
I/O is a better approach: Take a look at the hexpat-iteratee package.

IO is filed under Internal because it's low-level and most users won't want
it. The other Internal modules are re-exported by Annotated, Tree and Extended,
so you won't need to import them directly.

Credits to Iavor Diatchki and the xml (XML.Light) package for Proc and Cursor.
Thanks to the many contributors.

BOUND VS. UNBOUND THREADS: GHC (at least versions 6.12.X) will spawn threads
if you call a safe FFI callback from an unbound thread. This can get out of
control in a busy application. To avoid this, from version 0.19.1 we now delegate
processing to a single worker thread if the calling thread is not bound.
This essentially means that hexpat currently won't exploit multicores very well.
It also means that hexpat may be more efficient on threads spawned with forkOS
(to give you a bound thread) rather than forkIO.