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

Scala使用XML库获取指定name属性的value值问题

如何用Scala XML库获取指定属性的元素值

我来帮你解决这个问题,先梳理下问题根源,再给出正确的实现方式:

你的XML内容

<a>
  <b name = "d"value = "1"/>
  <b name = "e"value = "2"/>
  <b name = "f"value = "3"/>
</a>

你现有代码的问题

你的代码有两个关键错误导致输出为空:

  1. 路径定位错误:duration已经是加载后的<a>元素,不需要再用\\"a"去查找子元素,直接\\"b"就能拿到所有<b>子元素。
  2. 缺少筛选与目标属性提取:你只是提取了所有<b>元素的name属性,没有筛选出name="e"的项,更没有提取对应的value属性。

正确的实现方式

1. 独立处理XML字符串的示例

import scala.xml.XML

// 加载目标XML字符串
val xmlContent = """<a>
  <b name = "d"value = "1"/>
  <b name = "e"value = "2"/>
  <b name = "f"value = "3"/>
</a>"""
val root = XML.loadString(xmlContent)

// 筛选name为"e"的<b>元素,提取其value属性
val targetValue = (root \ "b")
  .find(bElement => bElement \@ "name" == "e") // 定位到匹配的元素
  .map(_ \@ "value") // 提取目标属性
  .getOrElse("") // 处理找不到元素的情况,返回空字符串

// 输出结果
println(targetValue) // 会打印出"2"

2. 适配你原有的map处理逻辑

把你的代码修改为如下形式,就能正确获取值:

map { line =>
  val rec = line.toString.split("\\^")
  val duration = XML.loadString(rec(4))
  // 找到目标元素并提取value
  val targetValue = (duration \ "b")
    .find(_ \@ "name" == "e")
    .map(_ \@ "value")
    .getOrElse("")
  targetValue
}

补充说明

  • 你的XML里属性写法name = "d"value = "1"虽然缺少属性间的空格,但Scala的XML解析器通常能正确识别,不过更规范的写法是name="d" value="1"(去掉属性名和值之间的空格,或者保留属性之间的空格)。
  • 使用find和map返回Option类型是更安全的做法,避免找不到元素时抛出异常,最后用getOrElse指定默认值即可。

内容的提问来源于stack exchange,提问作者Kumar Harsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:17:01