module Text.XML.Expat.Proc where
import Text.XML.Expat.Tree
import Data.Maybe(listToMaybe)
onlyElems :: [Node tag text] -> [Node tag text]
onlyElems xs = [ x | x@(Element _ _ _) <- xs ]
onlyText :: [Node tag text] -> [text]
onlyText xs = [ x | Text x <- xs ]
findChildren :: (GenericXMLString tag) => tag -> Node tag text -> [Node tag text]
findChildren q e = filterChildren ((q ==) . eName) e
filterChildren :: (Node tag text -> Bool) -> Node tag text -> [Node tag text]
filterChildren _ (Text _) = []
filterChildren p e = filter p (onlyElems (eChildren e))
filterChildrenName :: (tag -> Bool) -> Node tag text -> [Node tag text]
filterChildrenName _ (Text _) = []
filterChildrenName p e = filter (p . eName) (onlyElems (eChildren e))
findChild :: (GenericXMLString tag) => tag -> Node tag text -> Maybe (Node tag text)
findChild q e = listToMaybe (findChildren q e)
filterChild :: (Node tag text -> Bool) -> Node tag text -> Maybe (Node tag text)
filterChild p e = listToMaybe (filterChildren p e)
filterChildName :: (tag -> Bool) -> Node tag text -> Maybe (Node tag text)
filterChildName p e = listToMaybe (filterChildrenName p e)
findElement :: (GenericXMLString tag) => tag -> Node tag text -> Maybe (Node tag text)
findElement q e = listToMaybe (findElements q e)
filterElement :: (Node tag text -> Bool) -> Node tag text -> Maybe (Node tag text)
filterElement p e = listToMaybe (filterElements p e)
filterElementName :: (tag -> Bool) -> Node tag text -> Maybe (Node tag text)
filterElementName p e = listToMaybe (filterElementsName p e)
findElements :: (GenericXMLString tag) => tag -> Node tag text -> [Node tag text]
findElements qn e = filterElementsName (qn==) e
filterElements :: (Node tag text -> Bool) -> Node tag text -> [Node tag text]
filterElements p e
| p e = [e]
| otherwise = case e of
Element _ _ c -> concatMap (filterElements p) $ onlyElems c
_ -> []
filterElementsName :: (tag -> Bool) -> Node tag text -> [Node tag text]
filterElementsName _ (Text _) = []
filterElementsName p e = filterElements (p.eName) e