HXT忽略HTML DTD,将其替换为XML DTD

Ath*_*ark 5 doctype haskell hxt

我在弄清楚为什么HXT正在取代我的DTD时遇到了一些麻烦.首先,这是我要解析的输入文件:

<!DOCTYPE html>
<html>
  <head>
    <title>foo</title>
  </head>
  <body>
    <h1>foo</h1>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

<?xml version="1.0" encoding="US-ASCII"?>
<html>
  <head>
    <title>foo</title>
  </head>
  <body>
    <h1>foo</h1>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

最后,这是我正在使用的箭头的简化版本:

start (App src dest) = runX $
                         readDocument [ withValidate no
                                      , withSubstDTDEntities no
                                      , withParseHTML yes
                                      --, withTagSoup
                                      ]
                                      src
                         >>>
                         this
                         >>>
                         writeDocument [ withIndent yes
                                       , withSubstDTDEntities no
                                       , withOutputHTML
                                       --, withOutputEncoding "UTF-8"
                                       ]
                                       dest
Run Code Online (Sandbox Code Playgroud)

我为评论道歉 - 我一直在玩弄不同的配置组合.我似乎无法让HXT 不要乱用DTD,即使是withSubstDTDEntities no,withValidate no等等.我收到警告说HXT忽略了我的doctype声明,但这是我唯一的洞察力.有人可以借给我一个手吗?先感谢您!

jam*_*idh 4

你有两个问题

HXT 仅接受以下三种 html 文档类型之一

<!DOCTYPE html 
 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
 "DTD/xhtml1-strict.dtd">

<!DOCTYPE html
 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "DTD/xhtml1-transitional.dtd">

<!DOCTYPE html
 PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
 "DTD/xhtml1-frameset.dtd">
Run Code Online (Sandbox Code Playgroud)

使用其中之一将消除有关忽略 dtd 的警告。

其次,在 writeDocument 中添加以下选项

withAddDefaultDTD yes
Run Code Online (Sandbox Code Playgroud)