0

我有一大块以编程方式生成的 HTML。我使用以下 Java 代码通过 Tidy(版本 r938)运行它:

StringReader inStr = new StringReader(htmlInput);
StringWriter outStr = new StringWriter();
Tidy tidy = new Tidy();
tidy.setXHTML(true);
tidy.parseDOM(inStr, outStr);

我得到以下输出:

InputStream: Document content looks like HTML 4.01 Transitional
247 warnings, 3 errors were found!
This document has errors that must be fixed before
using HTML Tidy to generate a tidied up version.

麻烦的是,Tidy 没有告诉我它发现了什么 3 个错误。

我在这里撒了一点小谎。上面的输出实际上遵循所有 247 个警告的长列表(主要是修剪空div元素)。我可以压制那些有tidy.setShowWarnings(false); 无论哪种方式,我都没有看到错误报告,所以我无法弄清楚我需要修复什么。300Kb 的 HTML 对我来说太多了。

我尝试了多种方法来查找错误。遗憾的是,我无法通过 validate.w3.org 运行它,因为 HTML 文件位于专有网络上。信息最丰富的方法是在 IntelliJ IDEA 中打开它;这揭示了十几个重复的 div ID,我已修复。错误仍然发生。

我四处寻找有关此问题的其他提及。虽然我发现很多诸如“如何使用 JTidy 从解析的 HTML 中获取错误/警告消息?”之类的内容。,他们似乎都在要求不同的东西,或者假设条件根本不适合我。例如,我收到警告就好了;这是我需要的错误,即使我打电话setShowErrors(100)或其他什么都没有报告。

我是否必须深入研究 Tidy 的源代码并对其进行调试,从它报告错误的地方开始?或者有什么更简单的我可以做的吗?

4

1 回答 1

0

这是我最终为追踪错误所做的工作:

  1. 下载 JTidy 的源代码。大部分人应该都能直奔源头
  2. 将源码解压到我的开发区。就在我现有的源代码之上。这也意味着从我的 pom.xml 中删除 JTidy 的 Maven 条目。(这也意味着在 IntelliJ 对此感到非常困惑时击败 IntelliJ 提交(重新:编辑相关的 .iml 文件并重新启动 IJ 很多)。)
  3. 在 Report.error 中设置断点。第一行org.w3.tidy.Report.error()增量lexer.errorserror()从词法分析器的许多地方调用。
  4. 在调试模式下运行我的程序。如果输入的 HTML 很大,预计这需要一些时间;一个 300k 的文件在我的机器上花费了大约 10-15 秒的时间来停止一个错误,这个错误原来是在文件的最后。
  5. 查看lexbuf的内容。 lexbuf是一个字节数组,因此您的 IDE 可能不会将其显示为文本。它也可能很大。您可能想查看词法分析器正在查看的索引lexbuf。如果必须,请获取字节数组的该部分并将其与 ASCII 表交叉引用以获取文本。
  6. 在您的 HTML 中搜索该文本。假设它只出现一次,那就是你的错误。(就我而言,它恰好出现了 3 次,果然,我报告了 3 个错误。)

这比它可能应该涉及的要多得多。我怀疑Report.error()被不当调用。

就我而言,error()是用常量调用的BAD_CDATA_CONTENT。此常数仅由 使用Report.warning()error()不知道如何处理它,只是默默地退出,根本没有任何消息。如果我将调用Lexer.getCDATA()从更改error()warning(),我会得到错误的确切行和列。(我还得到了似乎是格式合理的 XHTML,而不是一个空文档。)

我会向 JTidy 项目提交一张带有一些建议的票,但 SourceForge 出于某种原因不允许我登录。所以在这里:

  • 鉴于此“错误”似乎不会导致文档无法解析,我将暂时建议将该调用设为警告。(在我的具体情况下,它是字符串常量内的 HTML 标记或script元素内的注释;不应该伤害任何东西。我问了另一个关于它的问题,以防万一。)
  • Report.error()应该有一个默认情况,如果它得到一个报告未处理的错误代码。

希望这可以帮助其他任何人遇到我猜是一个相当深奥的问题。

于 2016-11-28T17:56:02.083 回答