Comment générer des XMLTrees dans HXT ?
Question
J'essaie d'extraire les balises d'un fichier XML et d'écrire chacune d'elles dans un fichier séparé basé sur un attribut.
La partie extraction n'est pas si difficile :
*Main> ifs <- runX ( readDocument [withCurl [],withExpat yes] "file.xml" >>> getElement "TagName" >>> getAttrValue "Name" &&& this)
*Main> :t ifs
ifs :: [(String, XmlTree)]
J'ai essayé de mapper writeDocument sur les deuxièmes entrées mais sans succès.Je comprends que je dois le remettre dans la monade IO d'une manière ou d'une autre...mais je n'ai aucune idée sur la façon d'y parvenir.
à des fins de test, j'ai extrait l'un de ces XmlTrees du résultat :
*Main> let x = (map snd ifs) !! 0
*Main> :t x
x :: XmlTree
Je peux lancer des flèches dessus x
comme ça:
*Main> runLA (getName) x
["TagName"]
Mais lorsque j'essaie de l'écrire dans un fichier, j'obtiens un message d'erreur indiquant que je ne suis pas dans l'IO Monade (je pense) :
*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")'
En changeant runLA
à runIOSLA
n'aide pas :
*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
C'est tout ce que je peux aller.
Mise à jour
Comme le souligne Travis Brown, il est possible de le faire en une seule flèche :
runX . applyA $ readDocument [withCurl [],withExpat yes] "file.xml" >>> getElement "Tag" >>> getAttrValue "DEF" &&& this >>> arr (\ (n,x) -> root [] [constA x] >>> writeDocument [] n)