JTidy的一些小tips
今天看了一下JTidy的使用,目的就是為了格式化一個不標(biāo)準(zhǔn)的html到標(biāo)準(zhǔn)的xhtml。
JTidy是一個用java寫的HTML語法檢查器,用JTidy可以檢查并修正語法不正確的html,同時還可以對html的DOM進(jìn)行分析。Xhtml和html有很多不同,其中幾個主要的區(qū)別是:
1. XHTML元素必須被正確的嵌套。
2. XHTML元素必須被關(guān)閉。
3. 標(biāo)簽名必須用小寫字幕。
4. XHTML文檔必須有根元素。
想想這些限制也不無道理,這樣的限制可以將html格式化為格式嚴(yán)謹(jǐn)?shù)?/span>xml。
JTidy的使用也非常簡單,短短的幾行代碼就可以實現(xiàn)從原html到格式化好的xhtml:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

其中有幾個問題需要說明一下。理論上,在定義了tidy對象后,調(diào)用tidy.parse(in,out)或者tidy.parseDOM(in,out)就可以完成對輸入的格式化,將其輸出到輸出流上。Parse返回一個Node,而parseDOM返回一個Document。如果直接用InputStream和OutputStream,那么對于編碼的控制上,一般只能在tidy中控制了,而Tidy的內(nèi)置編碼中,簡體中文沒有設(shè)置。用起來不方便。如何實現(xiàn)中文頁面輸入,中文頁面產(chǎn)出是一個問題,網(wǎng)上提出了一種解決方法,通過利用生成一個中間UTF-8文件,在將其轉(zhuǎn)到輸出流上,可以完成中文的輸入。另一種實現(xiàn)就是利用最新的JTidy實現(xiàn)了parse(reader,writer)方法。因為支持reader和writer,所以可以像上面的代碼一樣,在包裝輸入流和輸出流的時候,進(jìn)行編碼的設(shè)定。這樣可以利用很短的代碼完成中文亂碼問題的解決,同時在效率上也要高于生成中間文件的方法。
至于在完成parse后的一個臨時文件的作用是在實踐中,發(fā)現(xiàn)有時候會遇到JTidy完成parse后document對象存在,但是輸出流沒有東西。需要調(diào)用pprint才會將其輸出。而什么時候調(diào)用pprint,我想到的方法就是判斷輸出文件是否為0.目前的情況就是要么輸出文件,但是空,即長度為0,要么完成了格式化,能正確輸出。因此,加一個if判斷可以解決通用的情況。posted on 2011-04-19 21:33 changedi 閱讀(1973) 評論(0) 編輯 收藏 所屬分類: Java技術(shù)