PostgreSQL的XML类型校验格式并支持XPath查询等操作,分document(单根)和content(多根)两种模式,需明确解析方式、用专用函数生成、通过xpath等安全提取内容。

PostgreSQL 的 XML 类型不是简单存字符串的“容器”,它会校验格式合法性,并支持 XPath 查询、结构化生成和类型安全操作。用对了,能高效处理配置、日志、文档等半结构化数据;用错了,可能插入失败或查询不准。
XML 类型的两种模式:document 和 content
XML 值默认按 content 模式解析,允许无根节点、多个顶层元素(比如 <a></a><b></b>)。而 document 模式要求严格符合 XML 文档规范:有且仅有一个根元素,可带 XML 声明(如 <?xml version="1.0"?>)。
- 查当前模式:
SHOW xmloption; - 临时切为 document 模式:
SET xmloption TO DOCUMENT; - 插入带声明的文档时,必须用
XMLPARSE(DOCUMENT '...'),不能依赖隐式转换 - 判断某列值是否为完整文档:
xml_column IS DOCUMENT返回布尔值
插入和创建 XML 值的常用写法
三种等效方式,推荐按场景选择:
-
XMLPARSE(DOCUMENT '<root><name>Alice</name></root>')—— 明确语义,适合带声明或需强约束的场景 -
XMLPARSE(CONTENT '<a>x</a><b>y</b>')—— 多根内容片段,比如拼接日志条目 -
xml '<item id="1">book</item>'或'<item>book</item>'::xml—— 简洁写法,依赖当前xmloption设置
注意:直接用字符串赋值给 xml 列时,若字符串含 <?xml ...?> 但当前是 CONTENT 模式,会报错。
从数据库生成 XML 的核心函数
不用手拼 XML 字符串,PostgreSQL 提供一组“SQL → XML”函数,适合导出、API 响应或归档:
-
table_to_xml('person', true, false, '')—— 把整张表转成 XML(true表示含 NULL,false表示 flat 结构) -
query_to_xml('SELECT id, name FROM person WHERE id=1', true, true, '')—— 把任意查询结果转 XML,true开启 tableforest 模式,每行一个独立根元素 -
xmlelement(name user, xmlattributes(id as "id"), name)—— 手动构造元素,支持属性和子内容,可嵌套使用 -
xmlconcat(xmlelement(...), xmlelement(...))—— 合并多个 XML 片段,空值自动跳过
查询和提取 XML 内容的关键方法
真正发挥 XML 类型价值的地方在于“查得准、取得稳”:
- 用
xpath('/book/title/text()', xml_col)提取文本值,返回xml[]数组,常配合[1]取首项或unnest() - 用
xmlexists('/book[price < 30]' PASSING BY REF xml_col)做条件过滤,只返回匹配的行 - 用
xmlcomment('generated at ' || now())插入注释节点,便于调试或标记来源 - 避免直接用
LIKE或正则匹配 XML 字符串 —— 会绕过结构校验,且无法处理命名空间、空白、编码等细节
基本上就这些。重点不在函数有多少,而在于分清“存什么模式”“怎么生成”“怎么安全取值”三个环节。用熟这四类操作,XML 就不再是黑盒,而是可控的结构化能力。

















