专栏首页java一日一条Jsoup代码解读之三-Document的输出

Jsoup代码解读之三-Document的输出

Jsoup官方说明里,一个重要的功能就是output tidy HTML。这里我们看看Jsoup是如何输出HTML的。

HTML相关知识

分析代码前,我们不妨先想想,“tidy HTML”到底包括哪些东西:

  • 换行,块级标签习惯上都会独占一行
  • 缩进,根据HTML标签嵌套层数,行首缩进会不同
  • 严格的标签闭合,如果是可以自闭合的标签并且没有内容,则进行自闭合

HTML实体的转义

这里要补充一下HTML标签的知识。HTML Tag可以分为block和inline两类。关于Tag的inline和block的定义可以参考http://www.w3schools.com/html/html_blocks.asp,而Jsoup的Tag类则是对Java开发者非常好的学习资料。

另外,Jsoup的Entities类里包含了一些HTML实体转义的东西。这些转义的对应数据保存在entities-full.properties和entities-base.properties里。

Jsoup的格式化实现

在Jsoup里,直接调用Document.toString()(继承自Element),即可对文档进行输出。另外OutputSettings可以控制输出格式,主要是prettyPrint(是否重新格式化)、outline(是否强制所有标签换行)、indentAmount(缩进长度)等。

里面的继承和互相调用关系略微复杂,大概是这样子:

Document.toString()=>Document.outerHtml()=>Element.html(),最终Element.html()又会循环调用所有子元素的outerHtml(),拼接起来作为输出。

我们终于找到了真正工作的代码,node.outerHtmlHead()和node.outerHtmlTail。Jsoup里每种Node的输出方式都不太一样,这里只讲讲两种主要节点:Element和TextNode。Element是格式化的主要对象,它的两个方法代码如下:

而ident方法的代码只有一行:

代码简单明了,就没什么好说的了。值得一提的是,StringUtil.padding()方法为了减少字符串生成,把常用的缩进保存到了一个数组中。

好了,水了一篇文章,下一篇将比较有技术含量的parser部分。

另外,通过本节的学习,我们学到了要把StringBuilder命名为accum,而不是sb。

本文分享自微信公众号 - java一日一条(mjx_java)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java Lambda 表达式学习笔记

    Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主...

    哲洛不闹
  • Java EE7和Maven工程入门(1)

    在日常工作中,我经常需要解决许多简单的或者是复杂的Maven/Java EE工程结构的问题。为了找到解决办法,我经常要拿项目的结构做实验,在不同应用服务器上对部...

    哲洛不闹
  • JAVA8之lambda表达式详解

    Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)

    哲洛不闹
  • 快速学习-登录页面的开发

    cwl_java
  • 学习纲要:HTML 基础概念

    Joel
  • HTML是什么?HTML版本发展

     参考链接:http://www.w3cwhy.com/css-html/w3c-html.html

    黑泽君
  • 【前端】初识HTML

    刚开始接触HTML的时候,对一些名词多少会有点疑问。在学习之前,不如先弄清楚它们是什么,以及他们之间的关系。

    Gavin-ZYX
  • 学习纲要:常见标签和属性

    Joel
  • 01.HTML教程/简介/基础

    01.HTML教程/简介/基础 HTML 教程- (HTML5 标准) 超文本标记语言(英语:HyperText Markup Language,简称:HTML...

    奋斗蒙
  • HTML知识点整理

    小胖

扫码关注云+社区

领取腾讯云代金券