簡體   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