跳转到主要内容

2200N — invalid_xml_content

PostgreSQL SQLSTATE 2200N 的来源与诊断参考。

2200N

速览

该成员表示 XML 内容无效。PostgreSQL 18.6 的核心 XML 解析器有内容模式的声明 guard 和内容解析 guard,会报告 2200N;原始 XML 选项决定文档解析失败是否改报 2200M。

字段
SQLSTATE 2200N
条件名 invalid_xml_content
状态 有效
已知存在于 8.3.0
锁定快照 9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_INVALID_XML_CONTENT
别名

含义

本成员表示 CONTENT 边界上的 XML 内容无效。在内容模式中,无效 XML 声明会报告 invalid XML content: invalid XML declaration,DETAIL 由 errdetail_for_xml_code(res_code) 动态生成。平衡内容解析失败会报告 invalid XML content;CONTENT 输入含 DOCTYPE 而被按文档解析时,失败仍依据原始选项选择 2200N。同一个解析调用在原始选项为 DOCUMENT 时使用 2200M。声明分支直接使用 errsave,内容分支使用 xml_errsave;有 ErrorSaveContext 时错误被保存并返回给调用方,普通上下文则抛出 ERROR。这与动态 DETAIL 是两个层次。

报文

引用分支以 ERROR 报告两类 primary:声明 guard 使用 invalid XML content: invalid XML declaration,并附加由 errdetail_for_xml_code(res_code) 生成的动态 DETAIL;后续内容或文档解析失败使用 invalid XML content。声明变体的 evidence 模板是 dynamic errdetail_for_xml_code(res_code),不是固定 DETAIL 文本。不能为这些解析失败虚构一个固定通用 DETAIL 或 HINT。2200L 是外层文档选项包装器,2200S 和 2200T 分别标识注释与处理指令语法。

诊断

阅读完整解析报文和其中指出的 XML 片段或值,检查元素名、字符数据、编码及操作要求的 XML 层级。服务器实际发出 2200L、2200M、2200S 或 2200T 时应直接按对应代码处理;不能只因报文出现“invalid”就选择 2200N。

处理

在诊断指出的元素、字符或编码边界修正 XML 内容,并在验证修复时保留实际代码。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南

版本

锁定目录从 8.3.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

2200L2200S2200T

来源

核心固定源码:src/backend/utils/adt/xml.c#L1780-1894。共享的 xml_errsave/errsave helper定义软错误与普通抛错的行为。结构化证据记录保留声明和内容解析 guard、动态 detail 边界及范围限制。核心路径依赖 USE_LIBXML;本页未运行自然 XML 案例。