如何使用XPath获取单场比赛中得分最高的球员?
用XPath找出单场比赛中得分最高的球员
先把你提供的XML文档贴出来方便参考:
<?xml version="1.0" encoding="UTF-8"?> <match> <summary> <team name="Barça" score="7"> <scorecard> <name points="1">Iniesta</name> <name points="2">Suarez</name> <name points="4">Messi</name> </scorecard> </team> <team name="Madrid" score="26"> <scorecard> <name points="3">Ronaldo</name> <name points="1">Buitre</name> <name points="2">Bale</name> </scorecard> </team> </summary> </match>
根据你的需求,我分两种XPath版本给出解决方案——不同XML解析工具对XPath版本的支持有差异,你可以根据自己的使用场景选择:
XPath 2.0(语法更简洁,推荐支持的场景使用)
XPath 2.0内置了max()函数,可以直接计算所有球员的得分最大值,再匹配对应的球员节点:
//name[number(@points) = max(//name/@points/number(.))]
解释:
//name:选中所有球员节点number(@points):把球员的points属性转为数值,避免字符串比较的误差max(//name/@points/number(.)):计算所有球员得分的最大值- 整个表达式的逻辑是:找出得分等于所有球员最高分的那个球员节点
执行后会返回:
<name points="4">Messi</name>
XPath 1.0(兼容更多旧版工具)
XPath 1.0没有内置max()函数,我们可以用反向排除的逻辑实现需求:
//name[not(//name/@points > @points)]
解释:
not(//name/@points > @points):意思是不存在任何一个球员的得分比当前球员高,那当前球员自然就是得分最高的- 这里无需额外转数值类型:XPath 1.0中如果两个操作数都是数字格式的字符串,会自动转为数值进行比较
执行这个表达式同样会返回得分最高的Messi节点。
如果需要直接获取球员的名字文本,可以在表达式末尾追加/text():
//name[number(@points) = max(//name/@points/number(.))]/text()
结果就是:Messi
内容的提问来源于stack exchange,提问作者Kiensabe




