{- | - 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 i (Document _ _ e _) = CElem e 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 (CElem e _) = e contentElem _ = error "content is not a CElem" attrs :: Element i -> [Attribute] attrs ( Elem _ attrs _ ) = attrs tagTextContent :: Content i -> [Char] tagTextContent ((CElem (Elem _ _ cs) _)) = concatMap verbatim 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 -}