跳到主要内容

XML 函数

PostgreSQL 的 xml 类型保存 XML 数据,提供构造、查询与聚合函数。只有确实需要交换或查询 XML 文档时才选用它;结构稳定的业务字段通常更适合关系列。以下使用 PostgreSQL。

构造与查询​

SELECT xmlelement(name item, xmlattributes(42 AS id), 'Book');
-- <item id="42">Book</item>

SELECT xpath('/catalog/item/@id',
'<catalog><item id="42"/></catalog>'::xml);
-- XML 节点数组

xmlelement、xmlforest、xmlconcat 构造 XML,避免手动拼字符串引发转义问题。xpath 返回 xml[] 节点数组,不是单个标量;命名空间前缀需要显式传入命名空间映射。xpath_exists 可以直接判断路径是否存在。

把 XML 展成行列​

SELECT x.id, x.label
FROM XMLTABLE(
'/catalog/item'
PASSING '<catalog><item id="42"><label>Book</label></item></catalog>'::xml
COLUMNS id integer PATH '@id', label text PATH 'label'
) AS x;

XMLTABLE 用行路径选节点、列路径抽取字段。多节点、缺失路径和无法转换为目标 SQL 类型时的行为需要测试;对必须存在的字段补充 NOT NULL 或约束。xmlagg(value ORDER BY ...) 可将多行 XML 聚合成一段,顺序敏感时在聚合内明确排序。

边界​

xml 可表示文档或片段;XMLPARSE(DOCUMENT ...) 与 XMLPARSE(CONTENT ...) 要求不同。解析不受信任的 XML 时关注实体、资源消耗和导出时的输出转义。XPath 1.0 的能力和 JSONPath 不同,不能直接套用后者语法。大文档频繁提取字段成本较高,常用检索字段可拆列或预处理。