module DTD where import Xml2Haskell {-Type decls-} newtype Persons = Persons [Person] deriving (Eq,Show) data Person = Person_Male_FathersName Person_Attrs Male (Maybe FathersName) | Person_Female_MothersName Person_Attrs Female (Maybe MothersName) deriving (Eq,Show) data Person_Attrs = Person_Attrs { personId :: Id } deriving (Eq,Show) newtype FathersName = FathersName String deriving (Eq,Show) newtype MothersName = MothersName String deriving (Eq,Show) data Male = Male { maleSrc :: (Maybe String) , maleAlt :: Alt } deriving (Eq,Show) data Alt = A | B deriving (Eq,Show) data Female = Female deriving (Eq,Show) {-Instance decls-} instance XmlContent Persons where fromElem (CElem (Elem "persons" [] c0):rest) = (\(a,ca)-> (Just (Persons a), rest)) (many fromElem c0) fromElem rest = (Nothing, rest) toElem (Persons a) = [CElem (Elem "persons" [] (concatMap toElem a))] instance XmlContent Person where fromElem (CElem (Elem "Person" as c0):rest) = case (\(a,ca)-> (\(b,cb)-> (a,b,cb)) (fromElem ca)) (fromElem c0) of (Nothing,Nothing,_) -> case (\(a,ca)-> (\(b,cb)-> (a,b,cb)) (fromElem ca)) (fromElem c0) of (Nothing,Nothing,_) -> (Nothing, c0) (Just a,b,[]) -> (Just (Person_Female_MothersName (fromAttrs as) a b), rest) (Just a,b,[]) -> (Just (Person_Male_FathersName (fromAttrs as) a b), rest) toElem (Person_Male_FathersName as a b) = [CElem (Elem "Person" (toAttrs as) (toElem a ++ maybe [] toElem b) )] toElem (Person_Female_MothersName as a b) = [CElem (Elem "Person" (toAttrs as) (toElem a ++ maybe [] toElem b) )] instance XmlAttributes Person_Attrs where fromAttrs as = Person_Attrs { personId = definiteA fromAttrToTyp "Person" "id" as } toAttrs v = catMaybes [ toAttrFrTyp "id" (personId v) ] instance XmlContent FathersName where fromElem (CElem (Elem "FathersName" [] c0):rest) = (\(a,ca)-> (Just (FathersName a), rest)) (definite fromText "text" "FathersName" c0) fromElem rest = (Nothing, rest) toElem (FathersName a) = [CElem (Elem "FathersName" [] (toText a))] instance XmlContent MothersName where fromElem (CElem (Elem "MothersName" [] c0):rest) = (\(a,ca)-> (Just (MothersName a), rest)) (definite fromText "text" "MothersName" c0) fromElem rest = (Nothing, rest) toElem (MothersName a) = [CElem (Elem "MothersName" [] (toText a))] instance XmlContent Male where fromElem (CElem (Elem "Male" as []):rest) = (Just (fromAttrs as), rest) fromElem rest = (Nothing, rest) toElem v = [CElem (Elem "Male" (toAttrs v) [])] instance XmlAttributes Male where fromAttrs as = Male { maleSrc = possibleA fromAttrToStr "src" as , maleAlt = definiteA fromAttrToTyp "Male" "alt" as } toAttrs v = catMaybes [ maybeA toAttrFrStr "src" (maleSrc v) , toAttrFrTyp "alt" (maleAlt v) ] instance XmlAttrType Alt where fromAttrToTyp n (n',v) | n==n' = translate (attr2str v) | otherwise = Nothing where translate "A" = Just A translate "B" = Just B translate _ = Nothing toAttrFrTyp n A = Just (n, str2attr "A") toAttrFrTyp n B = Just (n, str2attr "B") instance XmlContent Female where fromElem (CElem (Elem "Female" [] []):rest) = (Just Female, rest) fromElem rest = (Nothing, rest) toElem Female = [CElem (Elem "Female" [] [])] {-Done-}