-
Notifications
You must be signed in to change notification settings - Fork 1
让我们再来回顾一下组包的核心流程:
- 选中报文文档的根节点
- 从上到下遍历组包样式定义,检查其匹配器是否与当前报文节点匹配。
匹配器描述了一条规则,kyou以此来分出"满足规则的报文节点"和"不满足规则的报文节点"。
匹配器的语法借鉴自CSS3和jquery的选择器,看起来与这两种东西非常类似。
-
field
所有报文域节点均满足匹配要求 -
#Name
所有名称为Name的报文节点均满足匹配要求 -
field[type='int']
所有type属性为int的报文节点均满足要求 -
array:empty
所有报文数组节点,并且其内容为空 -
struct#HEAD struct>field[type='string']
一个比较复杂的匹配器,表示的是"一个位于结构中的报文域,其type属性为string,并且一定要有一个名为HEAD的报文结构作为祖先节点"。
jquery是"选择器"(selector),而kyou是"匹配器"(matcher)。当几个条件并列时,jquery会先在整棵dom树中_选择_出满足前面规则的节点,再从这些节点中_选择_出满足后面规则的节点。而kyou做的是检查给定的一个节点是否满足要求。
这造成的最典型的区别是,jquery中几个并列的规则,前后是包含关系;而kyou中并列的规则之间是单纯的"与"的关系。或者说,jquery选择器中,并列写在一起的各个规则是有顺序的,而kyou中并列写在一起的规则之间是无顺序的。
举一个例子如下:
struct#name:first
jquery的规则是先从整棵报文树中选择出struct类型的节点,再从中选择出名称为name的节点,再从这个列表中取出第一个。
而kyou不同,在组包时kyou首先会拿到一个待组包的报文节点,然后再去检查这个节点是不是struct、是不是名称为name,是不是结构中的第一个节点,只要这三个条件中有一个失败则返回匹配失败。