JTidy的一些小tips – JAVA編程語言程序開發技術文章

今天看瞭一下JTidy的使用,目的就是為瞭格式化一個不標準的html到標準的xhtml。



JTidy是一個用java寫的HTML語法檢查器,用JTidy可以檢查並修正語法不正確的html,同時還可以對html的DOM進行分析。Xhtml和html有很多不同,其中幾個主要的區別是:



1.    XHTML元素必須被正確的嵌套。



2.    XHTML元素必須被關閉。



3.    標簽名必須用小寫字幕。



4.    XHTML文檔必須有根元素。



想想這些限制也不無道理,這樣的限制可以將html格式化為格式嚴謹的xml。



JTidy的使用也非常簡單,短短的幾行代碼就可以實現從原html到格式化好的xhtml:



 1Tidy tidy = new Tidy();
 2
 3        try {
 4            FileInputStream fis = new FileInputStream(
 5                    “D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\test2.html”);
 6            InputStreamReader isr = new InputStreamReader(fis,”gb2312″);
 7            OutputStream fos = new FileOutputStream(
 8                    “D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\test2XHTML.html”);
 9            OutputStreamWriter osw = new OutputStreamWriter(fos,”gb2312″);
10            Document doc = tidy.parseDOM(isr, osw);
11            File tmpFile = new File(outFileName);
12            if(tmpFile.length()==0)
13                tidy.pprint(doc, out0);
14            // 轉換完成
15        } catch (java.io.FileNotFoundException e) {
16            System.out.println(e.getMessage());
17        } catch (UnsupportedEncodingException e) {
18            // TODO Auto-generated catch block
19            e.printStackTrace();
20
 
其中有幾個問題需要說明一下。理論上,在定義瞭tidy對象後,調用tidy.parse(in,out)或者tidy.parseDOM(in,out)就可以完成對輸入的格式化,將其輸出到輸出流上。Parse返回一個Node,而parseDOM返回一個Document。如果直接用InputStream和OutputStream,那麼對於編碼的控制上,一般隻能在tidy中控制瞭,而Tidy的內置編碼中,簡體中文沒有設置。用起來不方便。如何實現中文頁面輸入,中文頁面產出是一個問題,網上提出瞭一種解決方法,通過利用生成一個中間UTF-8文件,在將其轉到輸出流上,可以完成中文的輸入。另一種實現就是利用最新的JTidy實現瞭parse(reader,writer)方法。因為支持reader和writer,所以可以像上面的代碼一樣,在包裝輸入流和輸出流的時候,進行編碼的設定。這樣可以利用很短的代碼完成中文亂碼問題的解決,同時在效率上也要高於生成中間文件的方法。


至於在完成parse後的一個臨時文件的作用是在實踐中,發現有時候會遇到JTidy完成parse後document對象存在,但是輸出流沒有東西。需要調用pprint才會將其輸出。而什麼時候調用pprint,我想到的方法就是判斷輸出文件是否為0.目前的情況就是要麼輸出文件,但是空,即長度為0,要麼完成瞭格式化,能正確輸出。因此,加一個if判斷可以解決通用的情況

發佈留言