Не могу найти актуальную документацию и примеры для haXml.
Однако имеется некоторая документация для HXT.
Я знаю, что это, вероятно, излишество для вашего примера, но в любом случае.
Если вы хотите использовать tagoup, возможно, вам помогут следующие ответы:
парсер xml-дерева (Haskell) для библиотеки графов
Как в Haskell вы извлекаете строки из XML-документа?
Вот документация с примерами для HXT:
http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML
http://www.haskell.org/haskellwiki/HXT
http://www.haskell.org/haskellwiki/HXT/Practical
http://en.wikibooks.org/wiki/Haskell/XML
Теперь код с использованием HXT.
(предупреждение, я не уверен, что это правильный путь)
Я следовал уроку:
http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML
вам нужен ваш xml файл как "data.xml"
import Data.Map (Map, fromList, toList)
import Text.XML.HXT.Core
type Foos = Map String [Foo]
data Foo = Foo
{
fooId :: String
, fooName :: String
, arguments :: [Argument]
}
deriving (Show, Eq)
data Argument = Argument
{ argName :: String
}
deriving (Show, Eq)
instance XmlPickler Foo where
xpickle = xpFoo
instance XmlPickler Argument where
xpickle = xpArgument
-- WHY do we need this?? no clue
instance XmlPickler Char where
xpickle = xpPrim
-- this could be wrong
xpFoos :: PU Foos
xpFoos
= xpWrap (fromList
, toList
) $
xpList $
xpElem "MY" $
xpickle
xpFoo :: PU Foo
xpFoo
= xpElem "Foo" $
xpWrap ( uncurry3 Foo
, \ f -> (fooId f
, fooName f
, arguments f
)
) $
xpTriple (xpAttr "id" xpText)
(xpAttr "name" xpText)
(xpList xpickle)
xpArgument :: PU Argument
xpArgument
= xpElem "Argument" $
xpWrap ( \ ((a)) -> Argument a
, \ t -> (argName t)
) $
(xpAttr "name" xpText )
main :: IO ()
main
= do
runX ( xunpickleDocument xpFoos
[ withValidate no
, withTrace 1
, withRemoveWS yes
, withPreserveComment no
] "data.xml"
>>>
arrIO ( \ x -> do {print x ; return x})
)
return ()
РЕЗУЛЬТАТ (вам нужен пример xml как "data.xml"):
-- (1) getXmlContents
-- (1) readDocument: "data.xml" (mime type: "text/xml" ) will be processed
-- (1) readDocument: "data.xml" processed
fromList [("",[Foo {fooId = "1", fooName = "test", arguments = [Argument {argName = "a"}]},
Foo {fooId = "2", fooName = "test2", arguments = [Argument {argName = "a"},
Argument {argName = "b"}]}])]