我试图弄清楚如何使用HXT执行一些 XML 转换,但我不知道如何将整个文档输出到字符串。虽然文档显示了如何使用readDocument
and 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
回 a 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
的同时序列化一个 to ?String