Записать весь 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 сохраняя весь документ, включая корень?

0 ответов

Другие вопросы по тегам