Записать весь XML-документ в String, используя HXT
Я пытаюсь выяснить, как выполнить некоторые преобразования XML с помощью HXT, но я не могу понять, как вывести весь документ в строку. Пока документация показывает как использовать readDocument
а также writeDocument
они бегут в IO
и я пытаюсь понять, как сделать чистое преобразование.
(Между прочим: почему так много HXT определяется как нечистые функции? Одним из главных преимуществ Haskell является, на мой взгляд, то, что компилятор может гарантировать чистоту функций. Если бы я не заботился об этом, я мог бы выполнить моя цель XML уже написана на другом языке.)
Я понял, как читать строку XML с помощью HXT:
Prelude Text.XML.HXT.Core> x = "<foo><bar>baz</bar></foo>"
Prelude Text.XML.HXT.Core> runLA xread x
[NTree (XTag "foo" []) [NTree (XTag "bar" []) [NTree (XText "baz") []]]]
Это работает, как можно видеть, как и ожидалось.
Далее я хотел бы написать XmlTree
вернуться к String
:
Prelude Text.XML.HXT.Core> runLA (xread >>> writeDocumentToString []) x
["<bar>baz</bar>"]
Это суть моего вопроса: где foo
элемент?
Почему эта стрелка не туда и обратно? Почему не выход "<foo><bar>baz</bar></foo>"
?
Чтобы устранить проблему, я попытался напечатать представление на Haskell:
Prelude Text.XML.HXT.Core> runLA (xread >>> writeDocumentToString [withShowHaskell yes]) x
["NTree (XTag \"foo\" []) [NTree (XTag \"bar\" []) [NTree (XText \"baz\") []]]"]
В этом представлении, самый внешний foo
элемент все еще присутствует.
Можно также продемонстрировать это, напечатав дерево:
Prelude Text.XML.HXT.Core> putStrLn $ unlines $ runLA (xread >>> writeDocumentToString [withShowTree yes]) x
---XTag "foo"
|
+---XTag "bar"
|
+---XText "baz"
Опять же, вполне очевидно, что foo
Элемент все еще там.
Как я могу сериализовать XmlTree
к String
сохраняя весь документ, включая корень?