从复杂XML文档中筛选指定条件球员的SALARY值问题
问题:筛选指定条件球员的SALARY值
需要从给定XML文档中,获取NAME为ALONSO且POSITION为STRIKER的球员的SALARY值。
原XML文档
<PLAYERS> <PLAYER> <NAME>ALONSO</NAME> <POSITION>MIDFIELDER</POSITION> <AGE>28</AGE> <NATIONALITY></NATIONALITY> <SALARY>550000</SALARY> </PLAYER> <PLAYER> <NAME>MANE</NAME> <POSITION>STRIKER</POSITION> <AGE>30</AGE> <NATIONALITY></NATIONALITY> <SALARY>600000</SALARY> </PLAYER> <PLAYER> <NAME>ALONSO</NAME> <POSITION>STRIKER</POSITION> <AGE>23</AGE> <NATIONALITY>SPAIN</NATIONALITY> <SALARY>250000</SALARY> </PLAYER> </PLAYERS>
原尝试代码及问题
原代码返回了第一个ALONSO的SALARY值(550000),但该球员的POSITION是MIDFIELDER,不符合需求:
val salary = ("PLAYERS").flatMap { case pNode if (pNode \ "PLAYER" \ "NAME").head.text == "ALONSO" => (pNode \ "PLAYER" \ "SALARY").headOption.map(_.text) case _ => None }.headOption // result salary
问题分析
原代码逻辑错误:它直接从PLAYERS节点下判断是否存在名为ALONSO的球员,一旦找到就取第一个PLAYER节点的SALARY,没有针对每个PLAYER节点同时验证NAME和POSITION两个条件,导致匹配了不符合位置要求的球员。
正确解决方案
先遍历所有PLAYER节点,逐个验证条件,再提取符合要求的SALARY:
import scala.xml.XML // 加载XML(可替换为从文件加载:XML.load("players.xml")) val playersXml = XML.loadString("""<PLAYERS> <PLAYER> <NAME>ALONSO</NAME> <POSITION>MIDFIELDER</POSITION> <AGE>28</AGE> <NATIONALITY></NATIONALITY> <SALARY>550000</SALARY> </PLAYER> <PLAYER> <NAME>MANE</NAME> <POSITION>STRIKER</POSITION> <AGE>30</AGE> <NATIONALITY></NATIONALITY> <SALARY>600000</SALARY> </PLAYER> <PLAYER> <NAME>ALONSO</NAME> <POSITION>STRIKER</POSITION> <AGE>23</AGE> <NATIONALITY>SPAIN</NATIONALITY> <SALARY>250000</SALARY> </PLAYER> </PLAYERS>""") // 筛选符合条件的球员并提取SALARY val targetSalary = (playersXml \ "PLAYER") .filter(player => (player \ "NAME").text == "ALONSO" && (player \ "POSITION").text == "STRIKER" ) .flatMap(player => (player \ "SALARY").headOption.map(_.text)) .headOption // 输出结果:Some("250000") println(targetSalary)
代码说明
playersXml \ "PLAYER":获取XML中所有PLAYER子节点filter:逐个检查每个PLAYER节点,仅保留同时满足NAME为ALONSO、POSITION为STRIKER的节点flatMap + headOption:提取符合条件节点的SALARY文本,返回第一个匹配结果(若需所有符合条件的薪资,可替换为toList)
内容的提问来源于stack exchange,提问作者kajoe14
相关产品推荐
相关产品推荐

