3

HaskellでXMLファイルを解析する必要があったので、HXTを選択しました。私は今のところそれが好きですが、1つのことを行う方法を理解するのに苦労しています。

私が解析しているファイルには、構成ファイルとしての情報が含まれています。に似た構造になっています

<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

ただし、sのリストではなく、Rowから1つだけ返されるため、コンパイルされません。HXTを使用するのはこれが初めてなので、何か問題があることはわかっていますが、修正方法がわかりません。getTableRow

どんな助けでも素晴らしいでしょう、ありがとう!

4

1 に答える 1

3

私は関連する問題で答えを見つけることになりました、私はlistA(私もArrowsに本当に慣れていない)の存在を知りませんでした、そしてそれはそれを修正しました!

于 2013-01-04T17:49:50.647 に答える