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)
Était-ce utile?

La solution

Utiliser root et constA pour créer une flèche racine de document à partir de votre nœud :

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

Cela devrait fonctionner comme prévu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top