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
相关产品推荐
相关产品推荐

