You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:50:15