|
本帖最后由 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? | ❌ | ❌ | ✔️ | ✔️ |
|
|