Фон
Приложение Freeplane , похоже, умерло за свою многолетнюю смерть. Я извлекаю из него свои данные. Freeplane сохраняет данные как XML. Один из первых шагов, которые я предпринимаю, - это гомогенизация этого формата.
Вопрос, и что я хотел сделать
Моя цель - превратить каждый элемент XText
в .xml
-форматированный файл в XTag
, называемый "узел" с атрибутом "ТЕКСТ". Я сделал это, но таким образом, который кажется не элегантным.
Я хотел сделать это:
do
t <- getText
eelem "node" >>> addAttr "TEXT" t
Но когда я попытался, мне сообщили, что монады нет для IOSLA стрелка , следовательно, do
-позиция не доступна.
Возможно ли что-то подобное?
Что я сделал вместо
I копался в сыром, глубоко рекурсивном типе данных XmlTree и в итоге получил:
module Ask where
import Control.Category hiding ((.), id)
import Control.Arrow
import Text.XML.HXT.Core
import Data.Tree.NTree.TypeDefs
textToNode :: IOSArrow XmlTree XmlTree
textToNode = arr f where
f :: XmlTree -> XmlTree
f (NTree (XText s) children) =
-- `children` is always an empty subtree for Text items
let attrs = [ NTree
(XAttr $ mkName "TEXT")
[NTree (XText s) []] ]
in NTree (XTag (mkName "node") attrs) children
f x = x
go :: IO [XmlTree]
go =
runX $
readDocument [withValidate no] "flat.xml"
>>> deepest (ifA isText textToNode none)
>>> putXmlTree "-"
Чтобы увидеть его в действии, создайте файл с именем "flat. xml", содержащий:
<doc>
<a>1</a>
<b>2</b>
</doc>
Когда вы запустите go
, вы получите обратно «1» и «2», но вставлены в XTag
s следующим образом:
---XTag "node"
| "TEXT"="1"
(Вам также вернутся пробелы; это не важно.)