今天看了一下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判断可以解决通用的情况