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

Scala提取RSS XML数据时出现重复记录问题求助

问题原因及解决方案

嗨,刚学Scala遇到这种问题太正常了,我来帮你理清楚问题出在哪,怎么改~

为什么会得到12*12条记录?

你当前的for推导式里,title <- titleNodes和description <- descriptionNodes是两个完全独立的遍历操作,这相当于把所有标题集合和所有描述集合做了笛卡尔积配对——也就是每一个标题都会和12个描述分别组合一次,12×12自然就生成了144条重复的记录,这完全不符合每个item对应一条Record的预期。

正确的解决思路

XML里的每个<item>节点本身就是一个完整的记录单元,里面包含了对应的title和description,所以我们应该先定位到所有<item>节点,再对每个item单独提取它内部的title和description,这样就能保证一一对应了。

修正后的代码

case class Record(title: String, description: String)

def main(args: Array[String]): Unit = {
  val response: HttpResponse[String] = Http("link")
    .timeout(connTimeoutMs = 2000, readTimeoutMs = 5000)
    .asString
  val xmlString = response.body
  val xml = XML.loadString(xmlString)
  
  // 先获取所有的item节点,每个item对应一条完整记录
  val items = xml \ "item"
  
  // 遍历每个item,提取对应的title和description
  val output: Seq[Record] = items.map { item =>
    val title = (item \ "title").text
    val description = (item \ "description").text
    Record(title, description)
  }
  
  output.foreach(println)
}

如果你更喜欢用for推导式的写法,也可以改成这样:

val output: Seq[Record] = for {
  item <- items
} yield {
  val title = (item \ "title").text
  val description = (item \ "description").text
  Record(title, description)
}

这样处理后,每个item只会提取它自己内部的标题和描述,就能得到你期望的12个Record实例啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:41:43