# 2200M — invalid_xml_document

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

# 2200M

## 速览 {#at-a-glance}
该目录成员表示 XML 文档无效。PostgreSQL 18.6 的核心 `xml_parse` 文档分支会报告 `invalid XML document`，而 `contrib/xml2` 的 XSLT 路径在源文档或样式表解析失败时也使用同一 SQLSTATE。这些发出点不同于 2200L 的文档选项包装器。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `2200M` |
| 条件名 | `invalid_xml_document` |
| 状态 | `有效` |
| 已知存在于 | `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_DOCUMENT` |
| 别名 | `—` |

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

## 含义 {#meaning}
本成员来自具体的文档解析 guard，表示 XML 文档无效。在核心 `xml_parse` 中，`xmlCtxtReadDoc` 解析失败且原始 XML 选项为 DOCUMENT 时报告 2200M；原始选项为 CONTENT 时，同一解析失败报告 2200N。独立的 `contrib/xml2` 函数在把输入文档或样式表作为 XML 解析失败时使用 2200M。核心 `xml_errsave` 会把这些结果交给 `errsave`：传入 `ErrorSaveContext` 时保存错误并正常返回，普通上下文则抛出错误；这条软错误路径不同于 `contrib/xml2` 直接抛出 `ERROR` 的分支。

## 报文 {#messages}

核心分支以 `ERROR` 报告 primary：`invalid XML document`。`contrib/xml2` 分支以 `ERROR` 报告 primary：`error parsing XML document` 或 `error parsing stylesheet as XML document`。引用分支没有固定 DETAIL 或 HINT 模板；libxml2 上下文可能动态附加。不要把这些报文替换成 2200L 的 `not an XML document`。

## 诊断 {#diagnosis}
结合实际 SQLSTATE、message、detail 和 context，区分文档级失败与内容（2200N）、注释（2200S）或处理指令（2200T）错误。检查产生报文的是核心 `xml_parse` 还是 `contrib/xml2`，再修正报文指向的文档或样式表。本页已确认这些源码发出路径，但未运行自然案例。

## 处理 {#response}
根据实际报文和解析器上下文修正无效文档；未确认实际 SQLSTATE 前不要套用 2200L 的处理。

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

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

## 相关 {#related}
[`2200L`](../2200l/)、[`2200N`](../2200n/)

## 来源 {#sources}
核心固定源码：[`src/backend/utils/adt/xml.c#L1780-1862`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/xml.c#L1780-L1862)。独立的 [`contrib/xml2/xslt_proc.c#L84-100`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/xml2/xslt_proc.c#L84-L100) 路径解析 XML 文档和样式表。共享的 [`xml_errsave`/`errsave` helper](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/xml.c#L2047-L2082)定义软错误与普通抛错的行为。结构化[证据记录](../../data/evidence/2200m.json)保留两个发出点、报文角色和范围边界。核心路径依赖 `USE_LIBXML`；本页未运行自然 XML 案例。
