当前位置: 首页 > news >正文

资讯类网站模板下载安阳县辛村镇

资讯类网站模板下载,安阳县辛村镇,0453信息网免费发布,广西桂林电子科技大学转载自 Jsoup代码解读之三-Document的输出Jsoup官方说明里#xff0c;一个重要的功能就是***output tidy HTML***。这里我们看看Jsoup是如何输出HTML的。 HTML相关知识 分析代码前#xff0c;我们不妨先想想#xff0c;tidy HTML到底包括哪些东西#xff1a;…转载自   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开发者非常好的学习资料。 !-- lang: java -- // internal static initialisers: // prepped from http://www.w3.org/TR/REC-html40/sgml/dtd.html and other sources //block tags需要换行 private static final String[] blockTags {html, head, body, frameset, script, noscript, style, meta, link, title, frame,noframes, section, nav, aside, hgroup, header, footer, p, h1, h2, h3, h4, h5, h6,ul, ol, pre, div, blockquote, hr, address, figure, figcaption, form, fieldset, ins,del, s, dl, dt, dd, li, table, caption, thead, tfoot, tbody, colgroup, col, tr, th,td, video, audio, canvas, details, menu, plaintext }; //inline tags无需换行 private static final String[] inlineTags {object, base, font, tt, i, b, u, big, small, em, strong, dfn, code, samp, kbd,var, cite, abbr, time, acronym, mark, ruby, rt, rp, a, img, br, wbr, map, q,sub, sup, bdo, iframe, embed, span, input, select, textarea, label, button, optgroup,option, legend, datalist, keygen, output, progress, meter, area, param, source, track,summary, command, device }; //emptyTags是不能有内容的标签这类标签都是可以自闭合的 private static final String[] emptyTags {meta, link, base, frame, img, br, wbr, embed, hr, input, keygen, col, command,device }; private static final String[] formatAsInlineTags {title, a, p, h1, h2, h3, h4, h5, h6, pre, address, li, th, td, script, style,ins, del, s }; //在这些标签里需要保留空格 private static final String[] preserveWhitespaceTags {pre, plaintext, title, textarea };另外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()拼接起来作为输出。 !-- lang: java -- private void html(StringBuilder accum) {for (Node node : childNodes)node.outerHtml(accum); }而outerHtml()会使用一个OuterHtmlVisitor对所以子节点做遍历并拼装起来作为结果。 !-- lang: java -- protected void outerHtml(StringBuilder accum) {new NodeTraversor(new OuterHtmlVisitor(accum, getOutputSettings())).traverse(this); }OuterHtmlVisitor会对所有子节点做遍历并调用node.outerHtmlHead()和node.outerHtmlTail两个方法。 !-- lang: java -- private static class OuterHtmlVisitor implements NodeVisitor {private StringBuilder accum;private Document.OutputSettings out;public void head(Node node, int depth) {node.outerHtmlHead(accum, depth, out);}public void tail(Node node, int depth) {if (!node.nodeName().equals(#text)) // saves a void hit.node.outerHtmlTail(accum, depth, out);} }我们终于找到了真正工作的代码node.outerHtmlHead()和node.outerHtmlTail。Jsoup里每种Node的输出方式都不太一样这里只讲讲两种主要节点Element和TextNode。Element是格式化的主要对象它的两个方法代码如下 !-- lang: java -- void outerHtmlHead(StringBuilder accum, int depth, Document.OutputSettings out) {if (accum.length() 0 out.prettyPrint() (tag.formatAsBlock() || (parent() ! null parent().tag().formatAsBlock()) || out.outline()) )//换行并调整缩进indent(accum, depth, out);accum.append().append(tagName());attributes.html(accum, out);if (childNodes.isEmpty() tag.isSelfClosing())accum.append( /);elseaccum.append(); }void outerHtmlTail(StringBuilder accum, int depth, Document.OutputSettings out) {if (!(childNodes.isEmpty() tag.isSelfClosing())) {if (out.prettyPrint() (!childNodes.isEmpty() (tag.formatAsBlock() || (out.outline() (childNodes.size()1 || (childNodes.size()1 !(childNodes.get(0) instanceof TextNode)))))))//换行并调整缩进indent(accum, depth, out);accum.append(/).append(tagName()).append();} }而ident方法的代码只有一行 !-- lang: java -- protected void indent(StringBuilder accum, int depth, Document.OutputSettings out) {//out.indentAmount()是缩进长度默认是1accum.append(\n).append(StringUtil.padding(depth * out.indentAmount())); }代码简单明了就没什么好说的了。值得一提的是StringUtil.padding()方法为了减少字符串生成把常用的缩进保存到了一个数组中。 好了水了一篇文章下一篇将比较有技术含量的parser部分。 另外通过本节的学习我们学到了要把StringBuilder命名为accum而不是sb。
http://www.zqtcl.cn/news/162757/

相关文章:

  • 有学给宝宝做衣服的网站吗防网站黑客
  • 十大搜索引擎网站微信小程序有什么用处?
  • 团购网站 seo烟台网站建设方案优化
  • 公司网站建设招标文件范本公益永久免费主机
  • 建设银行网站查询企业年金五合一免费建站
  • 做网站开发挣钱吗做网站手机版
  • 网站建设案例精粹 电子书广州白云学校网站建设
  • 良品铺子网站制作用什么软件来做网站
  • ip直接访问网站 备案哪有深圳设计公司
  • 平面构成作品网站第一设计
  • 济南小程序开发多少钱网站移动端优化工具
  • 大连开发区网站淘宝网站优化实例
  • 张家港建网站的公司做网站犯法了 程序员有责任吗
  • 小型企业网站建设项目浦东新区网站推广公司
  • 上海做网站优化公司ps最好用的素材网站
  • 网站建设品牌推广seo制作公司网站
  • 个人网站服务器一年多少钱科技让生活更美好作文450字
  • 开学第一课汉字做网站网盘资源搜索神器
  • 备案网站应用服务树莓派用来做网站
  • 找装修公司上什么网站湘潭交通网站
  • php网站服务建设网站增加关键字
  • 免费视频网站制作泰州东方医院
  • 单位的网站怎样设计才美观手机开发者选项
  • 网站可以做软件检测吗重庆潼南网站建设价格
  • 忘记网站后台地址建设网站协议范本
  • 平面设计素材网站排行榜前十名程序员网站开发框架
  • 搭建一个网站需要多少钱搜搜
  • 做搜狗手机网站手工制作大全折纸
  • 万网站天眼查询个人信息
  • 一份优秀的网络推广方案名风seo软件