module XML
( XMLNode(..)
, Name, XML, AttList
, stringValue, nodeName
, xAttlist, xAttval
, attributes, attval
, xELNode, xTXNode, xPINode
) where
import Tree
type Name = String
type GI = Name
type AttList = [(Name,String)]
type XML = Tree XMLNode
data XMLNode =
RTNode
| ELNode GI AttList
| TXNode String
| PINode Name String
| CXNode String
| ENNode Name
deriving Show
stringValue :: XML -> String
stringValue nd@(Tree d _) = case d of
RTNode -> concat [sv | TXNode sv <- preorderTree nd]
ELNode _ _ -> concat [sv | TXNode sv <- preorderTree nd]
TXNode s -> s
PINode _ v -> v
CXNode s -> s
ENNode _ -> ""
nodeName :: XMLNode -> Maybe Name
nodeName nd = case nd of
ELNode gi _ -> Just gi
PINode tgt _-> Just tgt
ENNode name -> Just name
RTNode -> Nothing
TXNode _ -> Nothing
CXNode _ -> Nothing
xAttlist :: XMLNode -> AttList
xAttlist (ELNode _ attlist) = attlist
xAttlist _ = []
xAttval :: Name -> XMLNode -> Maybe String
xAttval name = lookup name . xAttlist
xELNode :: (Name -> AttList -> a) -> XMLNode -> Maybe a
xTXNode :: (String -> a) -> XMLNode -> Maybe a
xPINode :: (String -> String -> a) -> XMLNode -> Maybe a
xELNode f (ELNode gi atts) = Just (f gi atts)
xELNode _ _ = Nothing
xTXNode f (TXNode txt) = Just (f txt)
xTXNode _ _ = Nothing
xPINode f (PINode tgt val) = Just (f tgt val)
xPINode _ _ = Nothing
attributes :: XML -> AttList
attributes = xAttlist . treeRoot
attval :: Name -> XML -> Maybe String
attval name = xAttval name . treeRoot