使用HXT将整个XML文档写入String

时间:2018-04-10 19:27:14

标签: haskell hxt

我试图弄清楚如何使用HXT执行某些XML转换,但我无法弄清楚如何将整个文档输出到字符串。虽然文档显示了如何使用readDocumentwriteDocument,但这些文件在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

0 个答案:

没有答案