HXT: Удивительное поведение при чтении и записи HTML в String в чистом коде - PullRequest
5 голосов
/ 26 августа 2011

Я хочу прочитать HTML из строки, обработать его и вернуть измененный документ в виде строки, используя HXT.Поскольку эта операция не требует ввода-вывода, я бы предпочел выполнить Arrow с runLA, а не с runX.

.1007 * Тем не менее, окружающий тег 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"]

Почему это так и как я могу это исправить?

1 Ответ

6 голосов
/ 26 августа 2011

Если вы посмотрите на 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:1020 *

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

Дает желаемый результат.

...