5

我想从字符串中读取 HTML,对其进行处理并使用 HXT 将更改后的文档作为字符串返回。由于此操作不需要 IO,因此我宁愿使用 with 执行 Arrow 而runLA不是 with runX

代码如下所示(为简单起见省略处理):

runLA (hread >>> writeDocumentToString [withOutputHTML, withIndent yes]) html

html但是,结果中缺少周围的标记:

["\n  <head>\n    <title>Bogus</title>\n  </head>\n  <body>\n        Some trivial bogus text.\n    </body>\n",""]

当我像这样使用 runX 时:

runX (readString [] html >>> writeDocumentToString [withOutputHTML, withIndent yes])

我得到了预期的结果:

["<html>\n  <head>\n    <title>Bogus</title>\n  </head>\n  <body>\n        Some trivial bogus text.\n    </body>\n</html>\n"]

为什么会这样,我该如何解决?

4

1 回答 1

6

如果您查看XmlTree两者的 s,您会发现它readString添加了一个顶级"/"元素。对于非IO runLA版本:

> putStr . formatTree show . head $ runLA xread html
---XTag "html" []
   |
   +---XText "\n  "
   |
   +---XTag "head" []
   ...

并与runX

> putStr . formatTree show . head =<< runX (readString [] html)
---XTag "/" [NTree (XAttr "transfer-Status") [NTree (XText "200")...
   |
   +---XTag "html" []
       |
       +---XText "\n  "
       |
       +---XTag "head" []
       ...

writeDocumentToString用于getChildren剥离此根元素。

解决此问题的一种简单方法是使用类似的东西selem将输出包装xread在类似的根元素中,以使其看起来像writeDocumentToString期望的输入类型:

> runLA (selem "/" [xread] >>> writeDocumentToString [withOutputHTML, withIndent yes]) html
["<html>\n  <head>\n    <title>Bogus</title>\n  </head>\n  <body>\n        Some trivial bogus text.\n    </body>\n</html>\n"]

这会产生所需的输出。

于 2011-08-26T19:57:59.060 回答