PostgreSQL支持XML数据类型及xpath()、XMLTABLE等函数实现XML存储与XPath查询。需创建xml列、用XMLPARSE插入、通过xpath()提取节点、XMLTABLE关系化展开、GIN索引优化,并正确处理命名空间。
如果您需要在 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 ‘
Lee Chen’));
3、也可直接插入字符串字面量(系统隐式调用 XMLPARSE):
INSERT INTO documents (content) VALUES (‘
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 并展开: