繁体   English   中英

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

[英]JTidy reports “3 errors were found!”… but does not say what they are

我有一大堆以编程方式生成的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)禁止显示这些tidy.setShowWarnings(false) 无论哪种方式,我都看不到错误报告,因此无法弄清楚需要解决的问题。 300Kb的HTML对我来说实在太大了。

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

我到处寻找有关此问题的其他提及。 当我发现诸如“如何使用JTidy如何从已解析的HTML中获取错误/警告消息?”之类的热门文章时, ,他们似乎都在要求不同的东西,或者假设条件根本不适合我。 例如,我得到的警告很好。 这是我需要的错误 ,即使我调用setShowErrors(100)东西也没有得到报告。

我是否必须深入Tidy的源代码并对其进行调试,从报告错误的地方开始? 还是我可以做些更简单的事情?

这是我最终要找出错误的方法:

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

这比原本应该涉及的要复杂得多。 我怀疑Report.error()被不当调用。

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

我会向JTidy项目提交票证并提供一些建议,但是出于某些原因,SourceForge不允许我登录。 所以在这里:

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

希望这可以帮助其他任何有我猜测是深奥的问题的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM