我有一大块以编程方式生成的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的源代码并进行调试,从报告错误开始?或者我能做的更简单吗?
答案 0 :(得分:0)
以下是我最终要追踪的错误:
org.w3.tidy.Report.error()
的第一行递增lexer.errors
;从词法分析器的许多地方调用error()
。lexbuf
是一个字节数组,因此您的IDE可能不会将其显示为文本。它也可能很大。您可能想要查看词法分析器在lexbuf
中查看的索引。如果必须,请获取字节数组的该部分并使用ASCII表交叉引用它以获取文本。这比它可能应该包含的要多得多。我怀疑Report.error()
被不恰当地调用了。
在我的情况下,使用常量error()
调用BAD_CDATA_CONTENT
。此常量仅由Report.warning()
使用。 error()
不知道如何处理它,只是无声地退出而没有任何消息。如果我将Lexer.getCDATA()
中的来电从error()
更改为warning()
,我会得到错误的确切行和列。 (我也得到了看似格式合理的XHTML,而不是空文档。)
我向JTidy项目提交了一些建议,但是SourceForge并没有让我因某种原因登录。所以,在这里:
script
元素内的注释;不应该伤害任何东西。I asked another question about it,以防万一。)Report.error()
应该有一个默认案例,如果有错误代码,则会报告未处理的错误代码。希望这有助于其他任何有我猜测的人是一个相当深奥的问题。