JTidy报告“发现3个错误!”......但没有说明它们是什么

时间:2016-11-18 22:32:47

标签: java jtidy

我有一大块以编程方式生成的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对我来说太过分了。

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

我四处寻找其他提及此问题的方法。虽然我发现"How can I get the error/warning messages out of the parsed HTML using JTidy?"之类的内容很多,但它们似乎都在寻求不同的东西,或者假设条件根本不适合我。例如,我收到警告就好了;这是我需要的错误,即使我打电话给setShowErrors(100)或其他什么,也没有被报道。

我是否需要深入了解Tidy的源代码并进行调试,从报告错误开始?或者我能做的更简单吗?

1 个答案:

答案 0 :(得分:0)

以下是我最终要追踪的错误:

  1. 下载JTidy的来源。大多数人应该能够直接进入the source
  2. 将源解压缩到我的开发区域。在我现有的源代码之上。这也意味着从我的pom.xml中删除了JTidy的Maven条目。 (这也意味着将IntelliJ击败提交(re:编辑相关的.iml文件并重新启动IJ),当它对此非常困惑时。)
  3. 在Report.error中设置断点。 org.w3.tidy.Report.error()的第一行递增lexer.errors;从词法分析器的许多地方调用error()
  4. 在调试模式下运行我的程序。如果输入HTML很大,则需要一段时间;一台300k的文件在我的机器上花费了大约10-15秒来停止发生在文件末尾的错误。
  5. 查看lexbuf的内容。 lexbuf是一个字节数组,因此您的IDE可能不会将其显示为文本。它也可能很大。您可能想要查看词法分析器在lexbuf中查看的索引。如果必须,请获取字节数组的该部分并使用ASCII表交叉引用它以获取文本。
  6. 在HTML中搜索该文字。假设它只出现一次,则表示您的错误。 (在我的情况下,它出现了三次,当然,我报告了三个错误。)
  7. 这比它可能应该包含的要多得多。我怀疑Report.error()被不恰当地调用了。

    在我的情况下,使用常量error()调用BAD_CDATA_CONTENT。此常量仅由Report.warning()使用。 error()不知道如何处理它,只是无声地退出而没有任何消息。如果我将Lexer.getCDATA()中的来电从error()更改为warning(),我会得到错误的确切行和列。 (我也得到了看似格式合理的XHTML,而不是空文档。)

    我向JTidy项目提交了一些建议,但是SourceForge并没有让我因某种原因登录。所以,在这里:

    • 鉴于此"错误"似乎没有让文件毁灭到不可解析性,我暂时建议将该电话作为警告。 (在我的特定情况下,它是一个字符串常量中的HTML标记或script元素内的注释;不应该伤害任何东西。I asked another question about it,以防万一。)
    • Report.error()应该有一个默认案例,如果有错误代码,则会报告未处理的错误代码。

    希望这有助于其他任何有我猜测的人是一个相当深奥的问题。