JTidy的使用和配置.doc_第1页
JTidy的使用和配置.doc_第2页
JTidy的使用和配置.doc_第3页
JTidy的使用和配置.doc_第4页
JTidy的使用和配置.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/blog/7303372010-08-05html to xml:Jtidy的使用及注意事项(jtidy-r938)文章分类:Java编程 最近在做一个项目,要把html转换为格式规范的xml(不受DTD约束),然后再用dom4j进行分析,于是就去找html to xml的工具。发现有两款,一个是NekoHTML,一个是Jtidy。因为貌似Jtidy比较符合我的需求,于是我就下载了Jtidy(jtidy-r938, 2009-12-01,新版本的 )。JTidy是HTML Tidy(一个HTML语法检查器和优雅的打印编排工具)的Java移植,除了本身具有的清除HTML文件难看或错误内容的功能外,还提供了一个DOM接 口,程序员可以将JTidy当作一个处理HTML文件的DOM解析器来使用。 而且它有很多参数可以设置,可以定制出符合用户要求的规范的XML文档格式。网上所有的帖子、教程都是讲的内容都差不多的(就两三篇在COPY),感觉参考价值不大,而且还是讲2001年那个版本,让我很汗,不过它上一次的更新的确是2001年的(这也得怪他的开发团队更新的慢)。下面我就简单的说说jtidy的使用,及一些我注意到的细节吧。Jtidy的使用非常简单,所有的功能都是通过一个类来完成的,即org.w3c.tidy.Tidy。Tidy类用于将html转换为xml的方法有3种,每种方法对输入输出参数都有多种重载,使用方法大同小异: Node parse (java.io.InputStream in, java.io.OutputStream out) Reads from the given input and returns the root Node. org.w3c.dom.Document parseDOM (java.io.InputStream in, java.io.OutputStream out) Parses InputStream in and returns a DOM Document node. void pprint (org.w3c.dom.Node node, java.io.OutputStream out) Pretty-prints a DOM Node. parseDOM()是直接调用parse()的,pprint()是用于输出org.w3c.dom.Node或者org.w3c.dom.Document对象的,所以一般直接调用parse()就够了。Jtidy使用非常简单,下面我就展示个 最简单的例子 : Java代码 1. importjava.io.FileInputStream;2. importjava.io.FileOutputStream;3. importjava.io.PrintWriter;4. importorg.w3c.tidy.Tidy;5. 6. publicclassTest7. 8. publicstaticvoidmain(Stringargs)throwsException9. 10. Tidytidy=newTidy();/使用Jtidy几乎只需要用的这一个类11. /设置jtidy的配置文件,当然你也可以在程序根据需要中设置12. tidy.setConfigurationFromFile(config.txt);13. tidy.setErrout(newPrintWriter(error.txt);/输出错误与警告信息,默认输出到stdout14. /需要转换的文件,当然你也可以转换URL的内容15. FileInputStreamin=newFileInputStream(original.htm);16. FileOutputStreamout=newFileOutputStream(out.html);/输出的文件17. tidy.parse(in,out);/开始转换了Jtidy把所有东西都封装好了,哈哈18. out.close();/转换完成关闭输入输出流19. in.close();20. 21. 22. import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.PrintWriter;import org.w3c.tidy.Tidy;public class Test public static void main(String args) throws Exception Tidy tidy = new Tidy();/使用Jtidy几乎只需要用的这一个类 /设置jtidy的配置文件,当然你也可以在程序根据需要中设置tidy.setConfigurationFromFile(config.txt);tidy.setErrout(new PrintWriter(error.txt); /输出错误与警告信息,默认输出到stdout /需要转换的文件,当然你也可以转换URL的内容FileInputStream in = new FileInputStream(original.htm); FileOutputStream out = new FileOutputStream(out.html); /输出的文件tidy.parse(in, out);/开始转换了Jtidy把所有东西都封装好了,哈哈out.close();/转换完成关闭输入输出流in.close(); Jtidy好用的原因是因为它 定制功能很强大 ,Tidy类里面有一堆setter/getter函数,就是用来对功能进行定制的。 当然这些配置信息也可从一个文件读出来,该文件是一个property file,例如: indent: autowrap: 72tidy-mark: yesdoctype: omitquote-nbsp: noquote-ampersand: nowrap-script-literals: yesliteral-attributes: yesforce-output: yes 下面列举了一些比较 常用的配置 (还有一大堆没列出来的, 附件里面有官网给出的配置含义,可以下载来参考 ):add-xml-decl:是否输出“” declarationenclose-text:是否将所有标签闭合enclose-block-text:给所有文本加上标签,使其闭合show-errors:是否输出错误show-warnings:是否输出警告quote-ampersand:是否将&输出为&quote-marks:是否将“输出为"quote-nbsp:是否将空格输出为 indent:是否要缩进:block-level tagsindent-spaces:每次缩进的空格数wrap:每行最多字符数,超过则自动换行,如果为0则不自动换行char-encoding:字符编码,类似的还有output-encoding、input-encodingliteral-attributes:是否保持attribute中的空白字符不变force-output:遇到错误是否继续输出numeric-entities:是否将字符输出为HTML字符实体(如<、>)doctype:是否输出DOCTYPEtidy-mark:是否要输出Jtidy的标签drop-font-tags:是否去掉、标签clean:是否要清除掉多余的标签,这对处理从MS Word中复制到Html中的内容特别有效 Tidy里面这么多的配置属性,要是用户不小心设了一些互相矛盾的配置怎么办? Tidy会自动将低层次的配置调整以满足高层次配置的要求。 配置之间具体的限制主要如下 (或许还有其他的,我尚未发现):如果enclose-block-text设为 yes,则enclose-text为yes如果input-xml设为 yes,则output-xml为yes如果input-xml设为 yes,则assume-xml-procins为yes如果input-xml设为 yes,则output-xhtml为no如果output-xhtml设为 yes,则output-xml为yes如果output-xhtml设为 yes,则uppercase-tags为no如果output-xhtml设为 yes,则uppercase-attributes为no如果输出字符集不是utf-8也不是ASCII且output-xml为yes,则 add-xml-decl为yes如果output-xml设为 yes,则quote-ampersand为yes如果output-xml设为 yes,则hide-endtags为no下面说说使用的时候 需要注意的问题 : 1、注释符号被转化为html字符实体例如: <!- /应当是 这是因为设了output-xml:yes 如果你不是想转换成xml格式,只是想输出结构良好的xhtml文档,那就不要把output-xml设为yesThis option specifies if Tidy should pretty print output, writing it as well-formed XML. Any entities not defined in XML 1.0 will be written as numeric entities to allow them to be parsed by a XML parser. The original case of tags and attributes will be preserved, regardless of other options.这个选项会将所有DTD未定义的字符输出成numeric entities,而且会无视jtidy其他的设置。2、输出的DocType在dom4j处理中可能导致报错Dom4j在解释xml的时候会访问web上的dtd,如果没联网的话,dom4j就会报错,如果想避免这种问题,可以把doctype设为omit(不输出DocType信息)。3、中文乱码解决由于jtidy转换html的时候需要考虑字符编码,但每个网页的字符编码都可能是不同的,如果有中文信息,那么很容易产生乱码。我的解决办法很简单,因为html文件里面一般都包含了字符编码的信息, 读进一小段来分析一下便可 。 以下是我是用的函数,只需读取前1024个字节,由于用到了InputStream的mark()、reset()方法,所以需要BufferedInputStream。 Java代码 1. /*2. *利用正则表达式匹配html输入流中的charset信息3. *parambin由于用到了InputStream的mark()、reset()方法,4. *所以需要BufferedInputStream5. *return该html文件的字符编码,如果没找到则返回iso8859-16. *throwsIOException7. */8. publicStringgetEncodingOfStream(BufferedInputStreambin)throwsIOException9. bytebytes=newbyte1024;/存放读入的信息,一次读入1024个字节10. bin.mark(1024);/标记初始位置,设标记失效的最大字节数为102411. intlen=bin.read(bytes);12. Stringencoding;13. Stringencoding_tag=*;/使用正则表达式匹配charset14. Stringdetector=newString(bytes,0,len,iso8859-1);/默认用iso8859-1,避免丢失信息15. PatternencodingPattern=Ppile(encoding_tag,Pattern.CASE_INSENSITIVE);16. Matcherm=encodingPattern.matcher(detector);17. if(m.find()18. encoding=m.group(1);/第1个group匹配的就是需要的字符编码19. else20. encoding=iso8859-1;/如果没找到就当做iso8859-1算了21. 22. bin.reset();23. returnencoding;24. 25. /* * 利用正则表达式匹配html输入流中的charset信息 * param bin 由于用到了InputStream的mark()、reset()方法, * 所以需要BufferedInputStream * return 该html文件的字符编码,如果没找到则返回iso8859-1 * throws IOException */ public String getEncodingOfStream(BufferedInputStream bin) throws IOException byte bytes = new byte1024;/存放读入的信息,一次读入1024个字节 bin.mark(1024);/标记初始位置,设标记失效的最大字节数为1024 int len = bin.read(bytes); St

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论