0

0

PostgreSQL的XML函数使用指南

月夜之吻

月夜之吻

发布时间:2026-01-14 23:31:22

|

261人浏览过

|

来源于php中文网

原创

xmlparse() 必须指定 DOCUMENT 或 CONTENT 模式:DOCUMENT 要求完整 XML(单根节点),CONTENT 允许片段;xpath() 需 xml 类型输入并正确处理命名空间;xmlserialize() 注意编码兼容性与空白控制;高频查询应避免在 WHERE 中直接用 xpath(),改用生成列或表达式索引。

postgresql的xml函数使用指南

xmlparse() 解析字符串为 XML 值时,必须指定 DOCUMENT 或 CONTENT

PostgreSQL 不允许直接把字符串当 XML 用,xmlparse() 是唯一入口,且强制要求声明解析模式。漏写 DOCUMENTCONTENT 会报错:ERROR: xmlparse requires a document or content keyword

区别在于:DOCUMENT 要求输入是完整、有且仅有一个根节点的 XML(如 ),而 CONTENT 允许片段(如 )。

  • 存整份配置文件?用 xmlparse(DOCUMENT 'x')
  • 只提取一段标签内容?用 xmlparse(CONTENT 'xy')
  • 若误用 DOCUMENT 解析片段,会报:ERROR: invalid XML document: invalid root element

xpath() 提取节点前,确保输入是 xml 类型且命名空间处理得当

xpath() 不接受 text 或 varchar,传入非 xml 值会直接报错:ERROR: function xpath(unknown, xml) does not exist。常见错误是忘了套一层 xmlparse()

更隐蔽的问题是命名空间。如果 XML 带 xmlns,XPath 表达式里不声明前缀,结果永远为空。

SELECT xpath('/root/item/text()', 
             xmlparse(DOCUMENT 'abc'));

上面返回空数组。正确做法是用 ARRAY[ARRAY['x', 'http://example.com']] 注册命名空间:

SELECT xpath('/x:root/x:item/text()', 
             xmlparse(DOCUMENT 'abc'),
                      ARRAY[ARRAY['x', 'http://example.com']]);

xmlserialize() 输出时注意 encoding 和 whitespace 控制

xmlserialize()xml 值转成字符串,默认编码是 UTF-8,但如果你显式指定 DOCUMENT ENCODING 'ISO-8859-1',而内容含中文,就会报错:ERROR: character with byte sequence 0xe4 0xb8 0xad in encoding "UTF8" has no equivalent in encoding "ISO_8859_1"

蛋糕连锁店网站管理系统(含小程序)1.6.9
蛋糕连锁店网站管理系统(含小程序)1.6.9

蛋糕连锁店网站管理系统(含小程序)是海南赞赞网络公司针对甜品糕点连锁企业开发的建站系统。程序主要采用了 thinkphp5内核开发,拥有独立自主的标签系统、函数系统、极方便二次开发,网站设计人员可以在该系统基础上设计出漂亮的网站模板。该系统现已在部分地区糕点连锁公司使用。

下载

另外,它默认保留原始换行与缩进;若用于生成 API 响应或比对哈希,建议加 INDENT 或手动 REPLACE() 清理空白:

  • 要压缩输出:先 xmlserialize(CONTENT x AS text),再用 regexp_replace(... , E'\\s+', ' ', 'g')
  • 要带缩进的可读格式:加 INDENT 子句,如 xmlserialize(CONTENT x AS text INDENT)
  • 别在 xmlserialize() 中混用 DOCUMENTCONTENT 模式去匹配原始解析方式,否则可能多出/少掉根节点

性能敏感场景下,避免在 WHERE 或 JOIN 条件中反复调用 xpath()

xpath() 是纯函数,无法走索引,每次调用都要全量解析 XML 文本并执行 XPath 引擎。如果表里有上万行 XML 字段,又在 WHERE xpath(...) = 'value' 中使用,查询会极慢。

可行解法只有两个:

  • 提前把关键字段抽出来,用生成列(PostgreSQL 12+)固化:ALTER TABLE docs ADD COLUMN title text GENERATED ALWAYS AS (xpath('//title/text()', content)::text[]) [1] STORED
  • 或建表达式索引:CREATE INDEX idx_docs_title ON docs USING btree ((xpath('//title/text()', content)::text[])[1]))
  • 注意:xpath() 返回的是 xml[] 数组,取值必须用下标(如 [1])并显式类型转换,否则索引无效

XML 字段本身不是为高频查询设计的,真要按内容检索,优先考虑 JSONB + GIN 索引,除非你明确需要 XML Schema 验证或 XSLT 处理能力。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1875

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2085

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

991

2024.11.28

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号