找回密码
 立即注册

微信扫码登录

使用验证码登录

QQ登录

只需一步,快速开始

查看: 47|回复: 2

过滤麻将游戏的Xpath语句详解

[复制链接]

47

主题

570

回帖

1424

积分

金牌会员

积分
1424
发表于 7 天前 | 显示全部楼层 |阅读模式
本帖最后由 william 于 2025-7-8 17:38 编辑

从78.22G  的rom库中过滤出麻将游戏,其实只用了一条语句,但这条语句稍微有点复杂,这里做一下详解,供小伙伴们参考,以后写类似的语句,可以作为参考模版,填入对应条件即可​我们要做的判断是 1992年之后的游戏,但年份不详的,表达为 199? 和200?的也筛选出来。同样,需要是麻将游戏(判断描述中有麻将字样或者操控部分是麻将操控)(麻将游戏很多有gambling属性,我去掉所有有gambling属性的游戏后,麻将游戏减少极多,所以不处理gambling了)游戏需要能运行​,这个判断 driver下的 emulation 不是初步的就可以了,初步模拟的意思是基本没搞好,有些虽然能运行,但很快就出问题。


语句本体:
xp://machine[(contains(description,'mahjong') or input/control[@type='mahjong']) and driver[not(@emulation='preliminary')] and (number(year)>1992 or string(year)='199?' or string(year)='200?')]


语句详解如下:
XPath 表达式逐行注释​:


//machine[                     1. 根节点选择器:从文档根节点开始查找所有 `machine` 元素
  (                            2. 逻辑分组:三个条件需同时满足(AND 关系)
    contains(description, 'mahjong')  3. 文本匹配:`description` 元素包含子字符串 "mahjong"
    or
    input/control[@type='mahjong']    4. 属性匹配:存在 `input/control` 子元素且其 `type` 属性为 "mahjong"
  )
  and
  driver[not(@emulation='preliminary')]  5. 排除条件:`driver` 子元素不存在 `emulation='preliminary'` 属性
  and
  (
    number(year) > 1992           6. 数值比较:`year` 转换为数值后 >1992
    or
    string(year) = '199?'         7. 严格字符串匹配:`year` 完全等于 "199?"(含问号)
    or
    string(year) = '200?'         8. 严格字符串匹配:`year` 完全等于 "200?"(含问号)
  )
]

关键语法解析​​
1. ​​路径表达式​​
//machine:从根节点开始递归查找所有 machine 元素。
input/control:选择 input 元素下的直接子元素 control(路径严格匹配)。
2. ​​谓词(Predicates)​​
[contains(description, 'mahjong')]:
使用 contains() 函数判断 description 的文本内容是否包含子字符串 "mahjong"。
[@type='mahjong']:
精确匹配属性值(type 属性必须等于 "mahjong")。
[not(@emulation='preliminary')]:
排除 emulation 属性值为 "preliminary" 的节点(逻辑非)。
3. ​​数值与字符串处理​​
number(year) > 1992:
将 year 转换为数值后比较(若转换失败则结果为 NaN,条件不成立)。
string(year) = '199?':
严格匹配 year 的完整字符串值(包括问号),不进行任何转换或通配符处理。





验证

年份值
数值条件 (>1992)
字符串匹配 (= '199?')
字符串匹配 (= '200?')
最终结果
1990
1991
1992
1993
✔️
✔️
199?
✔️
✔️
2000
✔️
✔️
200?
✔️
✔️


152

主题

1万

回帖

2万

积分

论坛元老

积分
22867

推广达人最佳新人

发表于 7 天前 | 显示全部楼层
进来支持一下!

47

主题

570

回帖

1424

积分

金牌会员

积分
1424
 楼主| 发表于 5 天前 | 显示全部楼层
本帖最后由 william 于 2025-7-10 00:30 编辑

这个东东,我研究了好一会 Xpath语法才弄好,特别是有些rom年代不详,写的时间是 199? 或者200? ,还不能不处理,不处理就会丢掉一些ROM

QQ|Archiver|手机版|小黑屋|肖琪模拟游戏站 ( 沪ICP备2023018581号-5|沪公网安备31011702888952号 )

GMT+8, 2025-7-15 23:36 , Processed in 0.067365 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表