Как вывести XMLTrees в HXT? - PullRequest
       28

Как вывести XMLTrees в HXT?

2 голосов
/ 24 февраля 2012

Я пытаюсь извлечь теги из XML-файла и записать каждый из них в отдельный файл на основе атрибута.

Часть извлечения не так сложна:

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

Я пытался сопоставить writeDocument со вторыми записями, но безуспешно.Я понимаю, что мне нужно каким-то образом вернуть его обратно в монаду ввода-вывода ... но я не знаю, как этого добиться.


для целей тестирования, которые я извлек из этих XmlTrees из результата:

*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")'

Изменение runLA на runIOSLA не помогает:

*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

Это насколько я могу получить.

Обновление

Как указывает Трэвис Браун, это можно сделать одной стрелкой:

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

1 Ответ

1 голос
/ 24 февраля 2012

Используйте root и constA, чтобы сделать корневую стрелку документа из вашего узла:

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

Это должно работать как положено.

...