Jsoup代码解读之五-parser(中)_html/css_WEB-ITnose
代码结构
先介绍以下parser包里的主要类:
- Parser
Jsoup parser的入口facade,封装了常用的parse静态方法。可以设置maxErrors,用于收集错误记录,默认是0,即不收集。与之相关的类有ParseError,ParseErrorList。基于这个功能,我写了一个PageErrorChecker来对页面做语法检查,并输出语法错误。
- Token
保存单个的词法分析结果。Token是一个抽象类,它的实现有Doctype,StartTag,EndTag,Comment,Character,EOF6种,对应6种词法类型。
- Tokeniser
保存词法分析过程的状态及结果。比较重要的两个字段是state和emitPending,前者保存状态,后者保存输出。其次还有tagPending/doctypePending/commentPending,保存还没有填充完整的Token。
- CharacterReader
对读取字符的逻辑的封装,用于Tokenize时候的字符输入。CharacterReader包含了类似NIO里ByteBuffer的consume()、unconsume()、mark()、rewindToMark(),还有高级的consumeTo()这样的用法。
- TokeniserState
用枚举实现的词法分析状态机。
- HtmlTreeBuilder
语法分析,通过token构建DOM树的类。
- HtmlTreeBuilderState
语法分析状态机。
- TokenQueue
虽然披了个Token的马甲,其实是在query的时候用到,留到select部分再讲。
词法分析状态机
现在我们来讲讲HTML的词法分析过程。这里借用一下http://ued.ctrip.com/blog/?p=3295里的图,图中描述了一个Tag标签的状态转移过程,
这里忽略了HTML注释、实体以及属性,只保留基本的开始/结束标签,例如下面的HTML:
test
Jsoup里词法分析比较复杂,我从里面抽取出了对应的部分,就成了我们的miniSoupLexer(这里省略了部分代码,完整代码可以看这里MiniSoupTokeniserState):
enum MiniSoupTokeniserState implements ITokeniserState { /** * 什么层级都没有的状态 * ⬇ *test* ⬇ *test*/ Data { // in data state, gather characters until a character reference or tag is found public void read(Tokeniser t, CharacterReader r) { switch (r.current()) { case 'test
上一篇: 个人开源-智能交通系统
下一篇: linux的几个常用命令
推荐阅读
-
Jsoup代码解读之四-parser(上)_html/css_WEB-ITnose
-
Jsoup代码解读之五-parser(中)_html/css_WEB-ITnose
-
Jsoup代码解读之四-parser(上)_html/css_WEB-ITnose
-
Jsoup代码解读之七-实现一个CSS Selector_html/css_WEB-ITnose
-
Jsoup代码解读之五-parser(中)_html/css_WEB-ITnose
-
Jsoup代码解读之一-概述_html/css_WEB-ITnose
-
Jsoup代码解读之七-实现一个CSS Selector_html/css_WEB-ITnose
-
Jsoup代码解读之一-概述_html/css_WEB-ITnose
-
Jsoup代码解读之三-Document的输出_html/css_WEB-ITnose
-
Jsoup代码解读之三-Document的输出_html/css_WEB-ITnose