5

文字列からHTMLを読み取り、それを処理して、HXTを使用して変更されたドキュメントを文字列として返したい。この操作はIOを必要としないので、私はよりrunLAもでArrowを実行したいと思い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

両方のsを見ると、トップレベルの要素が追加されてXmlTreeいることがわかります。非バージョンの場合: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" []
       ...

writeDocumentToStringgetChildrenこのルート要素を取り除くために使用します。

これを回避する簡単な方法の1つは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 に答える