Scala中使用通配符提取名称前缀匹配的XML节点
在Scala中提取名称以"b"开头的XML节点
我来帮你搞定这个Scala XML节点提取的问题~要从data这个Elem对象里筛选出所有名称以"b"开头的子节点,你可以结合Scala XML库的特性,用过滤和模式匹配来实现,下面是几种靠谱的方案:
方案1:filter + 模式匹配(直观清晰)
这种方式先过滤出所有Elem类型的子节点(避免处理XML里的空格、换行这类Text节点),再检查节点名称是否符合要求:
import scala.xml.Elem // 假设这是你的data节点实例 val data: Elem = <data> <a>...</a> <b1>...</b1> <c>...</c> <b2>...</b2> <d>...</d> <b3>...</b3> </data> // 提取目标节点 val bNodes = data.child.filter { case elem: Elem => elem.label.startsWith("b") case _ => false // 忽略非Elem类型的节点 }
方案2:for推导式 + 模式匹配(简洁优雅)
用Scala的for推导式搭配模式匹配,代码更易读,还能直接提取节点名称做判断:
val bNodes = for { // 匹配所有Elem节点,同时提取它的label(即节点名称) elem @ Elem(_, label, _, _, _*) <- data.child // 过滤名称以"b"开头的节点 if label.startsWith("b") } yield elem
为什么你的代码可能编译失败?
大概率是没考虑到data.child里会包含非Elem类型的节点(比如XML中的空格、换行会被解析成Text节点),如果直接对所有子节点调用label方法,就会因为类型不匹配触发编译错误。上面的方案都先确保只处理Elem类型的节点,完美避开了这个坑。
运行上述代码后,bNodes就是包含<b1>...</b1>、<b2>...</b2>、<b3>...</b3>的节点序列啦。
内容的提问来源于stack exchange,提问作者Paul Reiners
相关产品推荐
相关产品推荐

