PostgreSQL 8.3起xml2模块已被弃用,8.4起移除;应改用内置SQL/XML函数如xpath()、XMLPARSE等,确保类型安全与标准兼容。
PostgreSQL 的 xml2 模块在 8.3 版本起已被明确标记为**弃用(deprecated)**,且计划在 8.4 中彻底移除。你现在不应该在新项目中启用或依赖它——核心服务器已内置 SQL/XML 标准支持,功能更全、语法更规范、性能更可控。
xml2?兼容性与弃用警告从 PostgreSQL 8.3 开始,官方就通过 xml_is_well_formed()、xpath() 等内置函数替代了 xml2 模块的全部能力。关键点:
xml2 提供的 xpath_string()、xpath_nodeset() 等函数返回类型固定(如 text),无法保留原始 XML 类型语义,容易引发解析歧义CREATE EXTENSION xml2;,在 12+ 版本会直接报错:ERROR: extension "xml2" does not exist —— 它早已被剥离出默认发行版xpath_bool(document, query) 这类函数时,若 document 不是严格 well-formed(比如含未转义 &),会静默失败而非抛异常所有原来靠 xml2 完成的 XML 解析任务,现在应改用 xpath() + XML 类型组合。注意三点:
XML 类型值,不能直接传 TEXT;需先用 XMLPARSE(DOCUMENT '...') 或字面量 XML'abc '
xpath() 返回的是 XML[](XML 数组),不是字符串;要提取文本内容,得配合 unnest() 和 xmlcontent 或 xpath('/text()', ...)
(xpath('//active/text()', doc))[1]::text::boolean
SELECT (xpath('//person/name/text()', xmldoc))[1]::text AS name, (xpath('//person/age/text()', xmldoc))[1]::text::int AS age FROM (SELECT XMLPARSE(DOCUMENT '
') AS xmldoc) t; Alice 30
PostgreSQL 默认 xmloption 是 CONTENT(允许多根节点),但 XMLPARSE(DOCUMENT ...) 要求单根,否则报错:ERROR: invalid XML content。解决方法:
SHOW xmloption;
DOCUMENT 模式:SET xmloption TO DOCUMENT;
CONTENT 解析并包裹:XMLPARSE(CONTENT '')
)时,必须先转义或补全为 XHTML(
),否则 xml_is_well_formed() 返回 false
真正需要处理复杂 XML 的场景(如 XSLT、命名空间深度查询、外部 DTD 验证),PostgreSQL 原生能力仍有限——这时候该考虑把解析逻辑移到应用层(Python 的 lxml、Java 的 javax.xml.xpath),而不是回退到已废弃的 xml2 模块。