Change Dir

          先知cd——熱愛生活是一切藝術(shù)的開始

          統(tǒng)計

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評論排行榜

          JTidy的一些小tips

          今天看了一下JTidy的使用,目的就是為了格式化一個不標(biāo)準(zhǔn)的html到標(biāo)準(zhǔn)的xhtml。

          JTidy是一個用java寫的HTML語法檢查器,用JTidy可以檢查并修正語法不正確的html,同時還可以對htmlDOM進(jìn)行分析。Xhtmlhtml有很多不同,其中幾個主要的區(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

           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            // 轉(zhuǎn)換完成
          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對象后,調(diào)用tidy.parse(in,out)或者tidy.parseDOM(in,out)就可以完成對輸入的格式化,將其輸出到輸出流上。Parse返回一個Node,而parseDOM返回一個Document。如果直接用InputStreamOutputStream,那么對于編碼的控制上,一般只能在tidy中控制了,而Tidy的內(nèi)置編碼中,簡體中文沒有設(shè)置。用起來不方便。如何實現(xiàn)中文頁面輸入,中文頁面產(chǎn)出是一個問題,網(wǎng)上提出了一種解決方法,通過利用生成一個中間UTF-8文件,在將其轉(zhuǎn)到輸出流上,可以完成中文的輸入。另一種實現(xiàn)就是利用最新的JTidy實現(xiàn)了parse(reader,writer)方法。因為支持readerwriter,所以可以像上面的代碼一樣,在包裝輸入流和輸出流的時候,進(jìn)行編碼的設(shè)定。這樣可以利用很短的代碼完成中文亂碼問題的解決,同時在效率上也要高于生成中間文件的方法。

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

          posted on 2011-04-19 21:33 changedi 閱讀(1973) 評論(0)  編輯  收藏 所屬分類: Java技術(shù)

          主站蜘蛛池模板: 会东县| 新乐市| 江永县| 商都县| 六枝特区| 商南县| 安图县| 明水县| 屯门区| 咸阳市| 湖北省| 东宁县| 新营市| 荥阳市| 道真| 获嘉县| 东乌| 鹤岗市| 新丰县| 闸北区| 义马市| 阳高县| 扎赉特旗| 锦屏县| 印江| 高青县| 乐山市| 高台县| 洛川县| 固原市| 石景山区| 靖江市| 淮南市| 梨树县| 栾城县| 五家渠市| 香河县| 巫山县| 东辽县| 寻甸| 金山区|