XmlSlurper 适合大文件懒加载只读解析,内存低但不可修改;XmlParser 全量加载可编辑、支持命名空间严格控制及 Java XML 工具对接。

XmlSlurper 和 XmlParser 都是 Groovy 提供的 XML 解析工具,用法相似但底层行为和适用场景有关键差异。
内存使用与解析时机
XmlSlurper 采用懒加载(lazy evaluation):只在真正访问某个节点时才解析对应部分,不预先构建完整树结构。适合处理大文件,内存占用低,但多次访问同一路径可能重复计算。
- XmlParser 则一次性把整个 XML 加载为内存中的 DOM 树,访问快、支持随机读写
- XmlSlurper 返回的是 GPathResult,本质是“待求值的路径表达式”,不是真实对象
是否支持修改 XML
XmlParser 支持原地修改节点、增删属性、替换内容,还能直接序列化回字符串;XmlSlurper 是只读的,无法直接改写原始结构。
- 想用 Slurper 修改?得先转成字符串 → 用 Parser 解析 → 修改 → 再输出
- Parser 的 parse 结果是可变的 Node 对象,天然适配编辑类操作
命名空间处理方式不同
XmlParser 严格遵循命名空间规则,默认要求显式声明并按前缀访问;XmlSlurper 默认忽略命名空间,除非你主动启用。
- Slurper 要支持命名空间:构造时传入
new XmlSlurper(false, true)(第二个 true 表示启用命名空间) - Parser 即使不显式配置,也会识别 xmlns 属性并影响 GPath 查找逻辑
返回结果类型与 GPath 兼容性
两者都支持类似 root.child.grand.text() 这样的 GPath 写法,表面看几乎一样。但底层返回类型不同:
- XmlParser 返回 Node 或 NodeList(继承自 org.w3c.dom.Node)
- XmlSlurper 返回 GPathResult(轻量、不可变、延迟执行)
- 多数简单遍历场景下,语法可以互换;但涉及节点克隆、属性赋值等操作时,Parser 更直接
不复杂但容易忽略:选 Slurper 主要是图省内存、读大文件;选 Parser 是为了可修改、要精确控制命名空间、或需与其他 Java XML 工具(如 DOM/SAX)对接。基本上就这些。










