Scala使用XML库获取指定name属性的value值问题
如何用Scala XML库获取指定属性的元素值
我来帮你解决这个问题,先梳理下问题根源,再给出正确的实现方式:
你的XML内容
<a> <b name = "d"value = "1"/> <b name = "e"value = "2"/> <b name = "f"value = "3"/> </a>
你现有代码的问题
你的代码有两个关键错误导致输出为空:
- 路径定位错误:
duration已经是加载后的<a>元素,不需要再用\\"a"去查找子元素,直接\\"b"就能拿到所有<b>子元素。 - 缺少筛选与目标属性提取:你只是提取了所有
<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
相关产品推荐
相关产品推荐

