Scala解析非常规XML:如何提取<b>标签开头的"1111"值?
嘿,这个问题我太懂了!你之前用split("\n")的方法虽然能工作,但确实不够健壮——万一XML里的空白是空格而非换行,或者结构稍微变一下,就容易出问题。在Scala里处理XML,咱们应该利用它自带的XML处理API,从节点结构入手,而不是把XML当纯字符串折腾。
给你两个更优雅可靠的方案:
方案1:过滤文本子节点
先假设你已经把XML解析成了scala.xml.Elem实例:
val xml = <a> <b>1111 <c>2222</c> </b> </a>
然后通过节点的child属性筛选出文本节点,提取内容并清理空白:
val targetText = (xml \ "b").headOption .flatMap(bNode => bNode.child.collectFirst { case text: scala.xml.Text => text.text.trim }) .getOrElse("") // 没有找到时返回默认空字符串
这个方法的好处是:
- 精准定位
<b>下的第一个文本节点,不管周围是空格、换行还是其他空白字符,都能通过trim清理干净 - 用
headOption和flatMap避免了空指针异常,即使XML里没有<b>节点也不会崩溃
方案2:用XPath文本选择器
Scala的XML API支持简单的XPath表达式,直接提取节点下的文本内容:
val targetText = (xml \ "b" \ "text()").headOption .map(_.text.trim) .getOrElse("")
这个写法更简洁,\ "text()"会直接选中<b>节点下的所有文本节点,取第一个后清理空白即可,同样兼顾了健壮性。
对比你原来的方法,这两种方案都是基于XML的结构语义来操作,不会因为XML的格式调整(比如压缩成一行、换行位置变化)而失效,是处理这类需求的最优选择。
内容的提问来源于stack exchange,提问作者K. Th
相关产品推荐
相关产品推荐

