2011-08-26 64 views
4

我想从字符串中读取HTML,处理它并使用HXT将字符串作为字符串返回。由于此操作不需要IO,我宁愿执行箭头runLA而不是runXHXT:以纯代码读取和写入HTML到字符串时的令人惊讶的行为

的代码看起来是这样的(省略为了简化处理):

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"] 

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

回答

5

如果你看两者的XmlTree s,你会看到readString增加了一个顶级"/"元素。对于非IOrunLA版本:

> 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" [] 
     ... 

writeDocumentToStringgetChildren使用以剥离该根元素。

解决此问题的简单方法是使用类似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"] 

这将产生所需的输出。