0

我试图弄清楚如何使用HXT执行一些 XML 转换,但我不知道如何将整个文档输出到字符串。虽然文档显示了如何使用readDocumentand 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

4

0 回答 0