# 2200N — invalid_xml_content

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

# 2200N

## 速览 {#at-a-glance}
该成员表示 XML 内容无效。PostgreSQL 18.6 的核心 XML 解析器有内容模式的声明 guard 和内容解析 guard，会报告 2200N；原始 XML 选项决定文档解析失败是否改报 2200M。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| 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` |
| 别名 | `—` |

<!-- source facts: data/errcodes/2200N.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}
本成员表示 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 是两个层次。

## 报文 {#messages}

引用分支以 `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 分别标识注释与处理指令语法。

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

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

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

## 版本 {#versions}
锁定目录从 8.3.0 起记录该条件；固定源码覆盖 PostgreSQL 18.6。

## 相关 {#related}
[`2200L`](../2200l/)、[`2200S`](../2200s/)、[`2200T`](../2200t/)

## 来源 {#sources}
核心固定源码：[`src/backend/utils/adt/xml.c#L1780-1894`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/xml.c#L1780-L1894)。共享的 [`xml_errsave`/`errsave` helper](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/xml.c#L2047-L2082)定义软错误与普通抛错的行为。结构化[证据记录](../../data/evidence/2200n.json)保留声明和内容解析 guard、动态 detail 边界及范围限制。核心路径依赖 `USE_LIBXML`；本页未运行自然 XML 案例。
