Scala如何处理XML数据 Scala XML库

9次阅读

scala原生xml支持简洁但已弃用:2.11及之前内置,2.12+需单独引入scala-xml依赖;支持XML字面量、XPath风格查询(、\)、不可变节点操作;生产环境推荐jackson-dataformat-xml等现代库。

Scala如何处理XML数据 Scala XML库

Scala 原生支持 XML,语法简洁、集成度高,但需注意其底层机制和适用场景。Scala 2.11 及更早版本内置 XML 处理能力(基于轻量级 dom 实现),但从 Scala 2.12 开始,XML 支持被移出标准库,需单独引入依赖。

XML 字面量与基本解析

Scala 允许直接在代码中写 XML 字面量,编译器会自动转换为 scala.xml.node 实例:

Scala in Depth Josh Suereth

可直接赋值、拼接、嵌入表达式(用 {...}):

{ for (b {b.title} }

注意:XML 字面量不进行语法校验,非法结构(如未闭合标签)可能在运行时才报错。

查询与提取数据(XPath 风格)

使用 操作符快速定位节点:

  • node "title" —— 获取直接子元素中所有
  • node \ "author" —— 深度优先搜索所有 (含后代)
  • node "@id" —— 提取属性值(返回 NodeSeq

结果是 NodeSeq,可用 text 取文本内容,headOption 安全获取首个节点。

构建与修改 XML

XML 是不可变的,所有“修改”实际是创建新节点:

  • 添加子节点:node.copy(child = node.child :+ 49.99)
  • 替换属性:node % Attribute("id", Text("2"), NULL)
  • 过滤节点:node.child.Filter(_.label == "title")

避免频繁拼接大量字符串;对复杂生成逻辑,建议用 scala.xml.PrettyPrinter 控制缩进输出。

与外部库协作(现代推荐方案)

因原生 XML 库已弃用且缺乏流式处理、命名空间、XSD 验证等能力,生产环境建议:

  • 读写简单配置或模板:继续用原生支持(加 scala-xml 依赖)
  • 处理大型/标准 XML:接入 jackson-dataformat-xmlspray-json 的 XML 扩展
  • 需要 XPath/XSLT:用 javax.xml.xpath + scala.xml.XML.load 转为 org.w3c.dom.Document

Maven 依赖示例(Scala 2.13+):

  net.databinder
  scala-xml
  2.1.0

text=ZqhQzanResources