XMLSlurper适合快速读取和简单遍历,语法轻量但默认忽略命名空间;XMLParser适合修改、序列化和严格解析,保留完整XML结构;二者均为DOM解析器,大文件需改用SAX。

XMLSlurper 适合快速读取和简单遍历
当你要从 XML 中提取少量字段、做条件过滤或生成新结构,XMLSlurper 的链式调用和隐式属性访问最省力。它把 XML 节点映射成 Groovy 对象,支持 doc.root.child*.name.text() 这类写法,语法轻量。
但要注意:它默认不验证命名空间,也不保留注释、处理指令和 CDATA;如果 XML 里有 xmlns,得手动启用命名空间支持:new XmlSlurper(false, true)(第二个 true 表示开启命名空间感知)。
常见错误是直接用 doc.'soap:Body' 却没开启命名空间,结果返回空——这时不是路径写错,而是命名空间被忽略。
XMLParser 更适合修改、序列化和严格解析
XMLParser 返回的是标准 org.w3c.dom.Document 或 Node 树(取决于构造参数),节点可被安全修改、插入、删除,并能通过 Transformer 精确控制输出格式(缩进、编码、DOCTYPE 等)。
它默认保留所有 XML 结构信息:注释、CDATA、处理指令、属性顺序,也支持 DTD 和外部实体(需显式启用 setFeature("http://apache.org/xml/features/disallow-doctype-decl", false))。
性能上略低于 XMLSlurper,尤其在只读场景下多了一层 DOM 封装;但如果后续要写回文件或做结构重组,用 XMLParser 避免反复解析/序列化更稳妥。
websenB2B是一套经过完善设计的B2B行业网站程序,是windows nt系列环境下最佳的B2B行业网产站解决方案。精心设计的架构与功能机制,适合从个人到企业各方面应用的要求,为您提供一个安全、稳定、高效、易用而快捷的行业网站商务系统。分普及版和商业版等不同版本。一、网胜B2B电子商务系统SP6.2蓝色风格普及版本升级功能说明:1、邮件群发功能:可以选择某一级别的会员,并放入支持html
遇到 xmlns 或前缀时必须统一处理策略
两种解析器对命名空间的默认行为不同:XMLSlurper 默认忽略,XMLParser 默认保留但不自动绑定前缀。若 XML 含 xmlns:ns="http://example.com",且你想查 ns:tag:
-
XMLSlurper必须传入true启用命名空间,并用declareNamespace(ns: 'http://example.com')绑定前缀 -
XMLParser需配合getElementsByTagNameNS('http://example.com', 'tag')或 XPath//*[local-name()='tag' and namespace-uri()='http://example.com']
混用两种解析器处理同一份带命名空间的 XML 容易漏匹配——比如用 XMLSlurper 提取后转成字符串再喂给 XMLParser,命名空间声明可能丢失。
大文件或流式解析要考虑内存与 SAX
两者都是 DOM 解析器,会将整个 XML 加载进内存。XMLSlurper 和 XMLParser 都不支持流式(SAX/StAX)解析。遇到几十 MB 的 XML 文件,直接用它们会导致 OutOfMemoryError。
此时应切换到 SAXBuilder(JDOM)或 StreamingMarkupBuilder + 自定义 ContentHandler,或者用 XmlParser 的低配替代:
def parser = new XmlParser()
parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
// 仍属 DOM,但至少禁掉外部实体加载防 XXE
真正需要流式处理时,Groovy 本身不提供原生 SAX 封装,得依赖 Java 的 SAXParser 或第三方库如 XmlSlurper 的变体 StreamingJsonBuilder 不适用——名字带 Streaming 的是 JSON,不是 XML。









