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

从复杂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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:30:49