我需要解析Haskell中的XML文件,所以我选择了HXT。我到目前为止都喜欢它,但我无法弄清楚如何做一件事。
我正在解析的文件包含作为配置文件的信息。它有一个类似的结构
<clients>
<client>
<name>SomeName</name>
<info>MoreInfo</info>
<table>
<row>
<name>rowname1</name>
<value>rowvalue1</value>
</row>
<row>
<name>rowname2</name>
<value>rowvalue2</value>
</row>
</table>
</client>
...
</clients>
这种标记格式让我感到畏缩,但这是我必须要处理的。
我在Haskell中的每个记录都有如下记录
data Client = Client { name :: String, info :: String, table :: Table }
data Row = Row { name :: String, value :: String }
type Table = [Row]
我希望将数据作为Clients
的列表从文件中获取。我目前的代码看起来像
data Client = Client { name :: String, info :: String, table :: Table }
data Row = Row { name :: String, value :: String }
type Table = [Row]
getClients = atTag "client" >>>
proc client -> do
name <- childText "name" -< client
info <- childText "info" -< client
table <- getTable <<< atTag "table" -< client
returnA -< Client name info table
where
atTag tag = isElem >>> hasName tag
atChildTag tag = getChildren >>> atTag tag
text = getChildren >>> getText
childText tag = atChildTag tag >>> text
getTable = atChildTag "row" >>>
proc row -> do
name <- childText "name" -< row
value <- childText "value" -< row
returnA -< Row name value
但是它没有编译,因为它只从Row
返回一个getTable
,而不是Row
的列表。由于这是我第一次使用HXT,我知道我做错了什么,但我不知道如何修复它。
任何帮助都会很棒,谢谢!
答案 0 :(得分:3)
我最终在一个相关的问题中找到了答案,我不知道listA
的存在(我对Arrows也是新手),并修复了它!