    {- |
     - Only a small module containing some helper functions to extract xml content
     - I would have added this to Types but I've put it into an additional module
     - to avoid circular references (Verbatim <-> Types)
    -}

    module Text.XML.HaXml.Util
      (
      -- ** utility functions to access XML content
        docContent
      , contentElem
      , attrs
      , tagTextContent
      ) where

    --import Text.XML.HaXml.Posn
    import Text.XML.HaXml.Types
    import Text.XML.HaXml.Verbatim

    -- | Get the main element of the document so that you can apply
    --   CFilters directly.  'i' is typically (posInNewCxt "filename" Nothing)
    docContent :: i -> Document i -> Content i
    docContent :: forall i. i -> Document i -> Content i
    docContent i
    i (Document Prolog
    _ SymTab EntityDef
    _ Element i
    e [Misc]
    _) = Element i -> i -> Content i
    forall i. Element i -> i -> Content i
    CElem Element i
    e i
    i

    -- | If you know that your CFilter returns a tag, you can use this
    --   function to get the tagged Element.
    contentElem ::  Content i -> Element i
    contentElem :: forall i. Content i -> Element i
    contentElem (CElem Element i
    e i
    _) = Element i
    e
    contentElem Content i
    _ = [Char] -> Element i
    forall a. HasCallStack => [Char] -> a
    error [Char]
    "content is not a CElem"

    attrs :: Element i -> [Attribute]
    attrs :: forall i. Element i -> [Attribute]
    attrs ( Elem QName
    _ [Attribute]
    attrs [Content i]
    _ ) = [Attribute]
    attrs

    tagTextContent :: Content i -> [Char]
    tagTextContent :: forall i. Content i -> [Char]
    tagTextContent ((CElem (Elem QName
    _ [Attribute]
    _ [Content i]
    cs) i
    _)) = (Content i -> [Char]) -> [Content i] -> [Char]
    forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
    concatMap Content i -> [Char]
    forall a. Verbatim a => a -> [Char]
    verbatim [Content i]
    cs

    {-
      now you can extract an attribute quite easily:
        let doc = "<xml><a><b a=\"x\">content</b></a></xml>"
        let b = head $ xtract id "a/b" $ docContent (posInNewCxt filename Nothing) $ xmlParse filename doc
        putStrLn $ "attr a of tag b" ++ (show $ lookup "a" $  attrs $ contentElem b)
        putStrLn $ "text content of b :" ++ tagTextContent b
      still (too) much code IMHO
    -}