Pure-Haskell utilities for dealing with XML with the conduit package.


LTS Haskell 22.30:
Stackage Nightly 2024-07-21:
Latest on Hackage:

See all snapshots xml-conduit appears in

Maintained by Michael Snoyman
This version can be pinned in stack with:xml-conduit-,3014


This package provides parsing and rendering functions for XML. It is based on the datatypes found in the xml-types package. This package is broken up into the following modules:

  • Text.XML: DOM-based parsing and rendering. This is the most commonly used module.

  • Text.XML.Cursor: A wrapper around Text.XML which allows bidirectional traversing of the DOM, similar to XPath. (Note: Text.XML.Cursor.Generic is the same concept, but will work with any node representation.)

  • Text.XML.Unresolved: A slight modification to Text.XML which does not require all entities to be resolved at parsing. The datatypes are slightly more complicated here, and therefore this module is only recommended when you need to deal directly with raw entities.

  • Text.XML.Stream.Parse: Streaming parser, including some streaming parser combinators.

  • Text.XML.Stream.Render: Streaming renderer.

Additionally, the xml-hamlet package provides a more convenient syntax for creating XML documents. For a more thorough tutorial on this library, please see http://www.yesodweb.com/book/xml.


  • Entity declarations with tags inside are now correctly handled
  • Parser now fails gracefully on malformed entity declarations
  • Parameter entity declarations are now ignored


  • ] characters inside doctype are now correctly handled
  • Entity expansion loops are now detected and avoided
  • Add field psEntityExpansionSizeLimit in ParseSettings to limit the length of an entity expansion; set to 8192 characters by default


  • Remove deprecated functions (ignoreTag, ignoreAllTreesContent, takeAllTreesContent)
  • Rename parseText' into parseText
  • takeContent and ignoreContent now cover entities
  • Align behaviour of take* and ignore* functions

  • Use doctest to validate code examples from documentation


  • Upgrade to conduit 1.3.0


  • Add psDecodeIllegalCharacters field in ParseSettings to specify how illegal characters references should be decoded
  • Fix compatibility with GHC 8.4.1 #121


  • psDecodeEntities is no longer passed numeric character references (e.g.,  , A) and the predefined XML entities (&, <, etc). They are now handled by the parser. Both of these construct classes only have one spec-compliant interpretation and this behaviour must always be present, so it makes no sense to force user code to re-implement the parsing logic.
  • In prior versions of xml-conduit, hexadecimal character references with a leading 0x or 0X like &0x20; were accepted. This was not in compliance with the XML specification and it has been corrected.
  • xml-conduit now rejects some (but not all) invalid-according-to-spec entities during parsing: specifically, entities with a leading # that are not character references are no longer allowed and will be parse errors.


  • Dropped the dependency on data-default for data-default-class, reducing the transitive dependency load. For most users, this will not be a breaking change, but it does mean that importing Text.XML.Conduit will no longer bring various instances for Default into scope. This will break code that relies on those instances and does not otherwise see them. To fix this, import Data.Default from data-default or one of the more specific instance-providing packages directly (e.g., data-default-dlist for the DList instance).


  • New render setting, rsXMLDeclaration; setting it to False omits the XML declaration.


  • tag function no longer throws an exception when attributes don’t match #93
  • Add many_ combinator to avoid building results in memory #94
  • Turn some functions from Consumer Event m a to ConduitM Event o m a to allow yielding values
  • Replace takeAllTreesContent with takeAnyTreeContent, that only consumes one tree
  • Introduce NameMatcher type to refactor tag parsers
  • Add a couple of take* functions to stream events rather than parse them
  • Rename ignore* functions to comply with naming convention

  • Compatibility with blaze-markup- #95

  • Parse XML encoding case-insensitively
  • Remove extra EOL when printing XmlException

  • Handle CDATA in takeAllTreesContent #88


  • Improve XmlException definition and usage
  • Add ‘takeAllTreesContent’ function


  • Improvements for using xml-conduit for streaming XML protocols #85

  • transformers dep bump

  • Remove unneeded ImpredicativeTypes


  • dropWS retains consumed whitespace values #74 #75 #76

  • Generalize signature of choose (Fixes #72) #73


  • New render setting to control when to use CDATA #68
  • Escaping CDATA closing tag in CDATA #69


  • Support for iso-8859-1 #63


  • Add functions to ignore subtrees & result-streaming (yield) parsers #58


  • Drop system-filepath


  • Reuse ‘MonadThrow’ and ‘force’ for ‘AttrParser’ #52


  • Added helper functions to render XML elements #48


  • ‘parseText’ becomes ‘parseText’/‘parseTextPos’, depending on the output type #47

  • Allow blaze-builder 0.4

Support monad-control 1.0