0

0

PostgreSQL怎么存储和查询XML PostgreSQL xpath()函数用法

月夜之吻

月夜之吻

发布时间:2026-02-07 12:35:58

|

435人浏览过

|

来源于php中文网

原创

PostgreSQL支持XML数据类型及xpath()、XMLTABLE等函数实现XML存储与XPath查询。需创建xml列、用XMLPARSE插入、通过xpath()提取节点、XMLTABLE关系化展开、GIN索引优化,并正确处理命名空间。

postgresql怎么存储和查询xml postgresql xpath()函数用法

如果您需要在 PostgreSQL 中处理 XML 数据,系统提供了专门的 XML 数据类型和内置函数来支持存储、解析与查询。以下是实现 XML 存储与 XPath 查询的具体操作步骤:

一、创建含 XML 类型的表并插入数据

PostgreSQL 提供了 xml 数据类型,用于安全地存储格式良好的 XML 内容;插入前会自动验证其良构性(well-formedness),避免非法 XML 进入数据库。

1、执行 CREATE TABLE 语句,定义一个包含 xml 类型列的表:

CREATE TABLE documents (id SERIAL PRIMARY KEY, content XML);

2、使用 XMLPARSE 函数插入合法 XML 字符串:

INSERT INTO documents (content) VALUES (XMLPARSE(CONTENT 'PostgreSQL Guide Lee Chen'));

3、也可直接插入字符串字面量(系统隐式调用 XMLPARSE):

INSERT INTO documents (content) VALUES ('Advanced SQL Jane Doe');

二、使用 xpath() 函数提取 XML 节点内容

xpath() 函数接受 XPath 表达式和 XML 值作为输入,返回 text[] 数组,每个元素对应一个匹配节点的文本内容;若无匹配,则返回空数组。

1、查询所有文档中 元素的文本值:

SELECT xpath('/book/title/text()', content) FROM documents;

2、将结果展开为多行(配合 UNNEST):

SELECT UNNEST(xpath('/book/title/text()', content))::TEXT AS title FROM documents;

3、提取多个路径并组合输出:

SELECT (xpath('/book/title/text()', content))[1]::TEXT AS title, (xpath('/book/author/text()', content))[1]::TEXT AS author FROM documents;

三、使用 XMLTABLE 进行关系化展开

XMLTABLE 将 XML 数据按指定 XPath 映射为关系表结构,适合复杂嵌套或需多列对齐的场景;它比反复调用 xpath() 更高效且语义清晰。

1、定义命名空间(如 XML 含 xmlns 属性)并在 XMLTABLE 中声明:

SELECT * FROM XMLTABLE(XMLNAMESPACES('http://example.com' AS ns), '/ns:root/ns:item' PASSING '1A'::XML COLUMNS id INT PATH 'ns:id', name TEXT PATH 'ns:name');

2、从表字段中读取 XML 并展开:

ChatGPT Website Builder
ChatGPT Website Builder

ChatGPT网站生成器,AI对话快速生成网站

下载

SELECT t.id, x.title, x.author FROM documents t, XMLTABLE('/book' PASSING t.content COLUMNS title TEXT PATH 'title', author TEXT PATH 'author') AS x;

3、处理重复子节点(如多个 )时,PATH 表达式可匹配多个节点,XMLTABLE 自动为每组生成一行。

四、索引优化 XML 查询性能

对频繁查询的 XML 路径,可基于 xpath() 或 XMLTABLE 表达式创建函数索引,避免每次执行时重复解析;索引类型必须为 GIN,且仅适用于 xpath() 返回非空数组的判定场景。

1、为判断是否存在特定元素创建 GIN 索引:

CREATE INDEX idx_xml_title ON documents USING GIN (xpath('/book/title/text()', content));

2、查询时利用索引加速存在性检查:

SELECT * FROM documents WHERE xpath('/book/title/text()', content) != ARRAY[]::TEXT[];

3、注意:不能对 xpath() 结果直接建立 B-tree 索引,因返回类型为 text[],而 B-tree 不支持该类型;必须使用 GIN。

五、处理带命名空间的 XML 文档

当 XML 包含 xmlns 声明时,XPath 表达式必须显式绑定命名空间前缀,否则无法匹配任何节点;xpath() 和 XMLTABLE 均支持 XMLNAMESPACES 子句声明映射关系。

1、插入含默认命名空间的 XML:

INSERT INTO documents (content) VALUES (XMLPARSE(CONTENT 'NS Book'));

2、在 xpath() 中声明命名空间并使用前缀:

SELECT xpath('//ns:title/text()', content, ARRAY[ARRAY['ns', 'http://book.org']]) FROM documents;

3、在 XMLTABLE 中等效写法:

SELECT * FROM XMLTABLE(XMLNAMESPACES('http://book.org' AS ns), '//ns:book' PASSING (SELECT content FROM documents LIMIT 1) COLUMNS title TEXT PATH 'ns:title');

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

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

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

1915

2024.04.01

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

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

2099

2024.08.01

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

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

1104

2024.11.28

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

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

424

2023.08.03

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

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

213

2023.09.04

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

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

1515

2023.10.24

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

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

精品课程

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

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