2

xml ファイルからタグを抽出し、属性に基づいて個別のファイルにそれぞれを書き込もうとしています。

抽出部分はそれほど難しくありません。

*Main> ifs <- runX ( readDocument [withCurl [],withExpat yes] "file.xml" >>> getElement "TagName" >>> getAttrValue "Name" &&& this)
*Main> :t ifs
ifs :: [(String, XmlTree)]

2 番目のエントリに writeDocument をマップしようとしましたが、成功しませんでした。どうにかしてIOモナドに戻さなければならないことは理解していますが、これを達成する方法がわかりません。


テスト目的で、結果からこれらの XmlTree を抽出しました。

*Main> let x = (map snd ifs) !! 0
*Main> :t x
x :: XmlTree

x次のように矢印を実行できます。

*Main> runLA (getName) x
["TagName"]

しかし、ファイルに書き込もうとすると、IO Monadeにいないことを示すエラーメッセージが表示されます(私は思います):

*Main> runLA (writeDocument [] "test.xml") x

<interactive>:1:8:
    Couldn't match expected type `LA a0 b0'
                with actual type `IOSLA (XIOState s0) XmlTree XmlTree'
    Expected type: LA a0 b0
      Actual type: IOStateArrow s0 XmlTree XmlTree
    In the return type of a call of `writeDocument'
    In the first argument of `runLA', namely
      `(writeDocument [] "test.xml")'

に変更runLArunIOSLAても役に立ちません:

*Main> runIOSLA (writeDocument [] "test.xml") x

<interactive>:1:40:
    Couldn't match expected type `XIOState s0'
            with actual type `Data.Tree.NTree.TypeDefs.NTree XNode'
    Expected type: XIOState s0
      Actual type: XmlTree
    In the second argument of `runIOSLA', namely `x'
    In the expression: runIOSLA (writeDocument [] "test.xml") x

それは私が得ることができる限りです。

アップデート

Travis Brown が指摘しているように、これは 1 つの矢印で行うことができます。

runX . applyA $ readDocument [withCurl [],withExpat yes] "file.xml" >>> getElement "Tag" >>> getAttrValue "DEF" &&& this >>> arr (\ (n,x) -> root [] [constA x] >>> writeDocument [] n)
4

1 に答える 1

1

rootとを使用constAして、ノードからドキュメント ルートの矢印を作成します。

runX (root [] [constA x] >>> writeDocument [] "test.xml")

これは期待どおりに動作するはずです。

于 2012-02-24T18:03:30.887 に答える