如何用sxml-match匹配任意元素?提取XCB结构名称遇语法错误求助
关于sxml-match的两个问题解答
问题1:匹配任意单个元素
你尝试用(,element)匹配空元素失败,原因是sxml-match的元素模式需要符合节点结构定义。正确匹配无属性无子节点的任意元素,直接使用绑定标签变量的模式即可:
(sxml-match '(div) ((,tag) #t))
若你的sxml-match版本要求显式声明无属性,也可写成:
(sxml-match '(div) ((,tag @()) #t))
这里@()表示元素无属性,tag会被绑定为元素的标签名(如示例中的div)。
问题2:从SXML结构中提取名称列表
报错是因为模式未匹配xproto的外层列表结构——xproto是包含多个SXML节点的列表,需先匹配整个列表,再逐个处理内部节点。
sxml-match完全可以胜任这项工作,调整后的代码如下:
(sxml-match xproto (((,kind (@ (name ,name)) . ,_) ...) (map list kind name)))
代码说明:
- 外层
((... ...)):匹配整个xproto列表,内部...表示重复匹配列表中的每个节点; (,kind (@ (name ,name)) . ,_):匹配单个节点,绑定kind为节点标签(如struct、xidtype),绑定name为name属性的值;. ,_用通配符忽略节点的子内容;(map list kind name):将匹配到的kind和name配对,生成目标格式的列表。
运行后会得到预期结果:
'((struct "CHAR2B") (xidtype "WINDOW") (xidtype "PIXMAP") (xidtype "ATOM") (xidunion "DRAWABLE"))
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

