我试图弄清楚如何使用HXT执行某些XML转换,但我无法弄清楚如何将整个文档输出到字符串。虽然文档显示了如何使用readDocument
和writeDocument
,但这些文件在IO
中运行,我试图找出如何进行纯转换。
(顺便说一句:为什么HXT被定义为不纯函数?Haskell的一个主要优点是,在我看来,编译器可以保证函数的纯度。如果我不关心那个,我本可以通过用另一种语言编写我的应用程序来完成我的XML目标。)
我已经弄清楚如何用HXT读取XML字符串:
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
?