{- | Example for usage of pickler functions to de-/serialise from/to XML Example data is taken from haskell wiki http://www.haskell.org/haskellwiki/HXT/Practical/Simple2 -} module Main where import Data.Map (Map, fromList, toList) import Text.XML.HXT.Core -- Example data taken from: -- http://www.ibiblio.org/xml/books/bible/examples/05/5-1.xml -- ------------------------------------------------------------ -- the data modell data Season = Season { sYear :: Int , sLeagues :: Leagues } deriving (Show, Eq) type Leagues = Map String Divisions type Divisions = Map String [Team] data Team = Team { teamName :: String , city :: String , players :: [Player] } deriving (Show, Eq) data Player = Player { firstName :: String , lastName :: String , position :: String , atBats :: Maybe Int , hits :: Maybe Int , era :: Maybe Float } deriving (Show, Eq) -- ------------------------------------------------------------ -- the pickler instance declarations -- in this case just for uniform naming instance XmlPickler Season where xpickle = xpSeason instance XmlPickler Team where xpickle = xpTeam instance XmlPickler Player where xpickle = xpPlayer -- ------------------------------------------------------------ -- for every data type there is a pickler -- the XML root element xpSeason :: PU Season xpSeason = xpElem "SEASON" $ xpWrap ( uncurry Season , \ s -> (sYear s, sLeagues s)) $ xpPair (xpAttr "YEAR" xpickle) xpLeagues xpLeagues :: PU Leagues xpLeagues = xpWrap ( fromList , toList ) $ xpList $ xpElem "LEAGUE" $ xpPair (xpAttr "NAME" xpText) xpDivisions xpDivisions :: PU Divisions xpDivisions = xpWrap ( fromList , toList ) $ xpList $ xpElem "DIVISION" $ xpPair (xpAttr "NAME" xpText) xpickle xpTeam :: PU Team xpTeam = xpElem "TEAM" $ xpWrap ( uncurry3 Team , \ t -> (teamName t, city t, players t) ) $ xpTriple (xpAttr "NAME" xpText) (xpAttr "CITY" xpText) (xpList xpickle) xpPlayer :: PU Player xpPlayer = xpElem "PLAYER" $ xpWrap ( \ ((f,l,p,a,h,e)) -> Player f l p a h e , \ t -> (firstName t, lastName t , position t, atBats t , hits t, era t ) ) $ xp6Tuple (xpAttr "GIVEN_NAME" xpText) (xpAttr "SURNAME" xpText) (xpAttr "POSITION" xpText) (xpOption (xpAttr "AT_BATS" xpickle)) (xpOption (xpAttr "HITS" xpickle)) (xpOption (xpAttr "ERA" xpPrim )) -- ------------------------------------------------------------ -- a simple pickle/unpickle application main :: IO () main = do runX ( xunpickleDocument xpSeason [ withValidate no , withTrace 1 , withRemoveWS yes , withPreserveComment no ] "simple2.xml" >>> processSeason >>> xpickleDocument xpSeason [ withIndent yes ] "new-simple2.xml" ) return () -- the dummy for processing the unpickled data processSeason :: IOSArrow Season Season processSeason = arrIO ( \ x -> do {print x ; return x}) -- ------------------------------------------------------------ -- the internal data of "simple2.xml" season1998 :: Season season1998 = Season { sYear = 1998 , sLeagues = fromList [ ( "American League" , fromList [ ( "Central" , [ Team { teamName = "White Sox" , city = "Chicago" , players = []} , Team { teamName = "Royals" , city = "Kansas City" , players = []} , Team { teamName = "Tigers" , city = "Detroit" , players = []} , Team { teamName = "Indians" , city = "Cleveland" , players = []} , Team { teamName = "Twins" , city = "Minnesota" , players = []} ]) , ( "East" , [ Team { teamName = "Orioles" , city = "Baltimore" , players = []} , Team { teamName = "Red Sox" , city = "Boston" , players = []} , Team { teamName = "Yankees" , city = "New York" , players = []} , Team { teamName = "Devil Rays" , city = "Tampa Bay" , players = []} , Team { teamName = "Blue Jays" , city = "Toronto" , players = []} ]) , ( "West" , [ Team { teamName = "Angels" , city = "Anaheim" , players = []} , Team { teamName = "Athletics" , city = "Oakland" , players = []} , Team { teamName = "Mariners" , city = "Seattle" , players = []} , Team { teamName = "Rangers" , city = "Texas" , players = []} ]) ]) , ( "National League" , fromList [ ( "Central" , [ Team { teamName = "Cubs" , city = "Chicago" , players = []} , Team { teamName = "Reds" , city = "Cincinnati" , players = []} , Team { teamName = "Astros" , city = "Houston" , players = []} , Team { teamName = "Brewers" , city = "Milwaukee" , players = []} , Team { teamName = "Pirates" , city = "Pittsburgh" , players = []} , Team { teamName = "Cardinals" , city = "St. Louis" , players = []} ]) , ( "East" , [ Team { teamName = "Braves" , city = "Atlanta" , players = [ Player { firstName = "Marty" , lastName = "Malloy" , position = "Second Base" , atBats = Just 28 , hits = Just 5 , era = Nothing} , Player { firstName = "Ozzie" , lastName = "Guillen" , position = "Shortstop" , atBats = Just 264 , hits = Just 73 , era = Nothing} , Player { firstName = "Danny" , lastName = "Bautista" , position = "Outfield" , atBats = Just 144 , hits = Just 36 , era = Nothing} , Player { firstName = "Gerald" , lastName = "Williams" , position = "Outfield" , atBats = Just 266 , hits = Just 81 , era = Nothing} , Player { firstName = "Tom" , lastName = "Glavine" , position = "Starting Pitcher" , atBats = Nothing , hits = Nothing , era = Just 2.47} , Player { firstName = "Javier" , lastName = "Lopez" , position = "Catcher" , atBats = Just 489 , hits = Just 139 , era = Nothing} , Player { firstName = "Ryan" , lastName = "Klesko" , position = "Outfield" , atBats = Just 427 , hits = Just 117 , era = Nothing} , Player { firstName = "Andres" , lastName = "Galarraga" , position = "First Base" , atBats = Just 555 , hits = Just 169 , era = Nothing} , Player { firstName = "Wes" , lastName = "Helms" , position = "Third Base" , atBats = Just 13 , hits = Just 4 , era = Nothing} ]} , Team { teamName = "Marlins" , city = "Florida" , players = []} , Team { teamName = "Expos" , city = "Montreal" , players = []} , Team { teamName = "Mets" , city = "New York" , players = []} , Team { teamName = "Phillies" , city = "Philadelphia" , players = []} ]) , ( "West" , [ Team { teamName = "Diamondbacks" , city = "Arizona" , players = []} , Team { teamName = "Rockies" , city = "Colorado" , players = []} , Team { teamName = "Dodgers" , city = "Los Angeles" , players = []} , Team { teamName = "Padres" , city = "San Diego" , players = []} , Team { teamName = "Giants" , city = "San Francisco" , players = []} ]) ]) ] } -- ------------------------------------------------------------