Разбор нескольких дочерних узлов в Haskell с помощью HXT
Мне нужно было проанализировать XML-файл в Haskell, поэтому я выбрал 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
s. Поскольку я впервые использую HXT, я знаю, что делаю что-то не так, но не знаю, как это исправить.
Любая помощь будет отличной, спасибо!
1 ответ
В итоге я нашел ответ в связанной проблеме, я не знал о существовании listA
(Я также действительно плохо знаком со Стрелками), и это исправило это!