import Text.XML.Expat.Pickle
import Text.XML.Expat.Tree
import qualified Data.ByteString.Lazy as L

-- Person name, age and description
data Person = Person String Int String

xpPerson :: PU [UNode String] Person
xpPerson =
    -- How to wrap and unwrap a Person
    xpWrap (\((name, age), descr) -> Person name age descr,
            \(Person name age descr) -> ((name, age), descr)) $
    xpElem "person"
        (xpPair
            (xpAttr "name" xpText0)
            (xpAttr "age" xpickle))
        (xpContent xpText0)

people = [
    Person "Dave" 27 "A fat thin man with long short hair",
    Person "Jane" 21 "Lives in a white house with green windows"]

main = do
    L.putStrLn $
        pickleXML (xpRoot $ xpElemNodes "people" $ xpList xpPerson) people

