java正则表达式去除xml标签之间的空格_HTML解析器——htmlparser2使用详解,换个姿势解析html和xml

上一篇文章我们介绍了一个html/xml解析器——htmlparser,这篇文章我们介绍另外一个解析模块htmlparser2,后者是对前者的重构,同时对前者的API做了部分兼容。

用法简介

安装

const { Parser } = require('htmlparser2');const parser = new Parser(handler, options);parser.parseComplete('html/xml内容');

写法

const { Parser } = require('htmlparser2');const parser = new Parser(handler, options);parser.parseComplete('html/xml内容');

htmlparser2提供了一个解析器——Parser,初始化它至少需要一个handler,options是可选的。

handler是一个对象,在这个对象上可以设置很多的钩子函数,Parser解析时会在每个阶段运行对应的钩子函数。

以下是可以设置的所有的钩子函数,

onopentag( name, attributes)onopentagname( name)onattribute( name, value)ontext( text)onclosetag( name)onprocessinginstruction( name, data)oncomment( data)oncommentend()oncdatastart()oncdataend()onerror( error)onreset()onend()

htmlparser模块是通过正则表达式来解析html内容的,而htmlparser2则不同,它会按顺序读取html的每个字符,并且推测后面字符是标签名、属性还是其他的类型,所以htmlparser2在解析完每一个标签后都会运行相应的钩子函数。

先来看一下例子,

46d58264faf773841f48e45f7433d1c6.png

图1

图1中设置了所有的钩子函数以便来说明每个钩子函数的作用,运行一下,

a2dcc220758cecc36d10e10f0fa7e5de.png

图2

对照图1和图2就能看出来每个钩子函数的运行时机,这其中有以下几个钩子函数需要注意一下。

  • oncdatastart和oncdataend会在解析标签时触发,但是触发的前提是选项设置了recognizeCDATA=true或者xmlMode=true;
  • onprocessinginstruction会在解析或者<?xxyy>这样的标签时触发,xx和yy中间可以有分隔符(斜杠或者空格),分隔符前面的字符串就是钩子函数中的name的值;
  • 运行parseComplete方法会执行reset钩子函数,如果仅仅执行parser的write或者end方法并不会执行reset方法。

除了自定义handler以外,htmlparser2还提供了几个handler,比如DomHandler,用法如下:

2b95f9ec724c4d096afbdeac5c825d49.png

图3

运行一下,我们看看结果,

c08c363bc36901201a561aa0deb64b36.png

图4

如果4所示,DomHandler处理的结果是以数组的形式输出的,在每个单元数据中还可以拿到上一个、下一个以及父节点的数据。

htmlparser2还可以通过操作流Stream解析内容,写法如下:

38fecee6fb7c956617dac75f00b199ca.png

图5

总结

这篇文章和上一篇是姊妹篇,都是介绍解析html/xml内容的模块,通过对比,我们发现htmlparser2模块功能更强大一些,也更灵活一些,同时也兼容htmlparser模块的一些接口。虽然两者功能类似,但是这给了我们更多的选择性。

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值