JTidy 报告“发现了 3 个错误!”...但没有说明错误是什么
JTidy reports "3 errors were found!"... but does not say what they are
我有一大块以编程方式生成的 HTML。我 运行 通过 Tidy(版本 r938)使用以下 Java 代码:
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)
压制那些;无论哪种方式,我都没有看到错误报告,所以我不知道我需要修复什么。 HTML 的 300Kb 对我来说太多了。
我尝试了多种方法来查找错误。我无法通过验证 运行 它。w3.org,很遗憾,因为 HTML 文件位于专有网络上。最有用的方法是在 IntelliJ IDEA 中打开它;这揭示了大约一打重复的 div ID,我修复了这些 ID。仍然出现错误。
我四处寻找其他提及此问题的地方。虽然我发现很多像 "How can I get the error/warning messages out of the parsed HTML using JTidy?" 这样的点击率,但它们似乎都要求不同的东西,或者假设条件对我来说根本不成立。例如,我收到警告就好了;这是我需要的 errors,即使我调用 setShowErrors(100)
或其他东西,也不会报告它们。
我是否必须 div进入 Tidy 的源代码并调试它,从它报告错误的地方开始?或者我可以做一些更简单的事情吗?
以下是我最终找出错误的方法:
- 下载JTidy的源码大部分人应该可以直接上the source.
- 将源代码解压缩到我的开发区。 就在我现有的源代码之上。这也意味着从我的 pom.xml 中删除 JTidy 的 Maven 条目。 (这也意味着击败 IntelliJ 提交(重新:编辑相关的 .iml 文件并多次重新启动 IJ)当它对此感到非常困惑时。)
- 在Report.error设置断点。第一行
org.w3.tidy.Report.error()
递增lexer.errors
; error()
从词法分析器的许多地方被调用。
- 运行 我的程序处于调试模式。 如果输入 HTML 很大,预计这需要一些时间;一个 300k 的文件在我的机器上花了大约 10-15 秒才停止,结果是在文件的最后出现了一个错误。
- 看看lexbuf的内容。
lexbuf
是一个字节数组,所以你的IDE可能不会显示为文本。也可能很大。您可能想查看词法分析器在 lexbuf
中查看的索引。如果必须,请获取字节数组的该部分并使用 ASCII table 交叉引用它以获取文本。
- 在您的 HTML. 中搜索该文本 假设它只出现一次,这就是您的错误。 (在我的例子中,正好出现了 3 次,果然,我报告了 3 个错误。)
这比它本来应该涉及的要多得多。我怀疑 Report.error()
被不当调用。
在我的例子中,error()
是用常量 BAD_CDATA_CONTENT
调用的。此常量仅由 Report.warning()
使用。 error()
不知道如何处理它,只是 静静地退出,没有任何消息。如果我将 Lexer.getCDATA()
中的调用从 error()
更改为 warning()
,我会得到错误的确切行和列。 (我还得到了看起来格式合理的 XHTML,而不是空文档。)
我会向 JTidy 项目提交一张票并提供一些建议,但 SourceForge 出于某种原因不允许我登录。所以,这里:
- 鉴于此 "error" 似乎不会使文档无法解析,我暂时建议将该调用改为警告。 (在我的具体情况下,它是字符串常量内的 HTML 标记或
script
元素内的注释;不应该造成任何伤害。I asked another question about it,以防万一。)
Report.error()
应该有一个默认情况,如果它得到一个,报告一个未处理的错误代码。
希望这对遇到我猜想是一个相当深奥的问题的其他人有所帮助。
我有一大块以编程方式生成的 HTML。我 运行 通过 Tidy(版本 r938)使用以下 Java 代码:
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)
压制那些;无论哪种方式,我都没有看到错误报告,所以我不知道我需要修复什么。 HTML 的 300Kb 对我来说太多了。
我尝试了多种方法来查找错误。我无法通过验证 运行 它。w3.org,很遗憾,因为 HTML 文件位于专有网络上。最有用的方法是在 IntelliJ IDEA 中打开它;这揭示了大约一打重复的 div ID,我修复了这些 ID。仍然出现错误。
我四处寻找其他提及此问题的地方。虽然我发现很多像 "How can I get the error/warning messages out of the parsed HTML using JTidy?" 这样的点击率,但它们似乎都要求不同的东西,或者假设条件对我来说根本不成立。例如,我收到警告就好了;这是我需要的 errors,即使我调用 setShowErrors(100)
或其他东西,也不会报告它们。
我是否必须 div进入 Tidy 的源代码并调试它,从它报告错误的地方开始?或者我可以做一些更简单的事情吗?
以下是我最终找出错误的方法:
- 下载JTidy的源码大部分人应该可以直接上the source.
- 将源代码解压缩到我的开发区。 就在我现有的源代码之上。这也意味着从我的 pom.xml 中删除 JTidy 的 Maven 条目。 (这也意味着击败 IntelliJ 提交(重新:编辑相关的 .iml 文件并多次重新启动 IJ)当它对此感到非常困惑时。)
- 在Report.error设置断点。第一行
org.w3.tidy.Report.error()
递增lexer.errors
;error()
从词法分析器的许多地方被调用。 - 运行 我的程序处于调试模式。 如果输入 HTML 很大,预计这需要一些时间;一个 300k 的文件在我的机器上花了大约 10-15 秒才停止,结果是在文件的最后出现了一个错误。
- 看看lexbuf的内容。
lexbuf
是一个字节数组,所以你的IDE可能不会显示为文本。也可能很大。您可能想查看词法分析器在lexbuf
中查看的索引。如果必须,请获取字节数组的该部分并使用 ASCII table 交叉引用它以获取文本。 - 在您的 HTML. 中搜索该文本 假设它只出现一次,这就是您的错误。 (在我的例子中,正好出现了 3 次,果然,我报告了 3 个错误。)
这比它本来应该涉及的要多得多。我怀疑 Report.error()
被不当调用。
在我的例子中,error()
是用常量 BAD_CDATA_CONTENT
调用的。此常量仅由 Report.warning()
使用。 error()
不知道如何处理它,只是 静静地退出,没有任何消息。如果我将 Lexer.getCDATA()
中的调用从 error()
更改为 warning()
,我会得到错误的确切行和列。 (我还得到了看起来格式合理的 XHTML,而不是空文档。)
我会向 JTidy 项目提交一张票并提供一些建议,但 SourceForge 出于某种原因不允许我登录。所以,这里:
- 鉴于此 "error" 似乎不会使文档无法解析,我暂时建议将该调用改为警告。 (在我的具体情况下,它是字符串常量内的 HTML 标记或
script
元素内的注释;不应该造成任何伤害。I asked another question about it,以防万一。) Report.error()
应该有一个默认情况,如果它得到一个,报告一个未处理的错误代码。
希望这对遇到我猜想是一个相当深奥的问题的其他人有所帮助。