Разбор нескольких дочерних узлов в 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вместо списка Rows. Поскольку я впервые использую HXT, я знаю, что делаю что-то не так, но не знаю, как это исправить.

Любая помощь будет отличной, спасибо!

1 ответ

Решение

В итоге я нашел ответ в связанной проблеме, я не знал о существовании listA (Я также действительно плохо знаком со Стрелками), и это исправило это!

Другие вопросы по тегам